2015-12-24 18 views
5

Sto cercando di creare un listview che consiste in una scrollview orizzontale come ciascuna delle righe. Voglio che gli elementi siano allineati verticalmente in modo che la vista diventi scorrevole se ci sono più di una certa quantità di elementi.ListView con ScrollView orizzontale

Tuttavia sembra così.

enter image description here

sto gonfiando il seguente codice XML

single_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:background="#FFFFFF" 
    android:layout_height="fill_parent"> 

    <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

     <com.example.jj.library.ChipView 
      android:layout_weight="1" 
      android:id="@+id/text_chip_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
     </LinearLayout> 

    </HorizontalScrollView> 

</LinearLayout> 

questo è il mio adattatore per aggiungere i punti di vista alla vista

Adapter.java

import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 

import com.example.jj.library.Chip; 
import com.example.jj.library.ChipView; 
import com.example.jj.library.ChipViewAdapter; 
import com.example.jj.library.OnChipClickListener; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by jj on 12/21/2015. 
*/ 
public class LiveFeedAdapter extends ArrayAdapter<LiveFeedDataProvider> implements OnChipClickListener { 


    private static final String TAG = "LIVEFEED ADAPTER"; 
    Context CTX; 
    private ChipView mTextChipLayout; 
    public List<LiveFeedDataProvider> liveFeed_list = new ArrayList<LiveFeedDataProvider>(); 

    public LiveFeedAdapter(Context context, int resource) { 
     super(context, resource); 
     CTX = context; 
    } 

    @Override 
    public void add(LiveFeedDataProvider object){ 
     liveFeed_list.add(object); 
     super.add(object); 
    } 

    @Override 
    public int getCount() { 
     return liveFeed_list.size(); 
    } 


    @Override 
    public LiveFeedDataProvider getItem(int position) { 

     return liveFeed_list.get(position); 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     if(convertView == null){ 
      LayoutInflater inflator = (LayoutInflater) CTX.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflator.inflate(R.layout.single_livefeed_row,parent,false); 
     } 
     ChipViewAdapter adapterLayout = new MainChipViewAdapter(getContext()); 
     mTextChipLayout = (ChipView) convertView.findViewById(R.id.text_chip_layout); 
     mTextChipLayout.setAdapter(adapterLayout); 
     mTextChipLayout.setChipLayoutRes(R.layout.chip_close); 
     mTextChipLayout.setChipBackgroundColor(CTX.getResources().getColor(R.color.light_blue)); 
     mTextChipLayout.setChipBackgroundColorSelected(CTX.getResources().getColor(R.color.green)); 
     mTextChipLayout.setOnChipClickListener(this); 
     LiveFeedDataProvider provider = liveFeed_list.get(position); 
     Log.d(TAG, "LENGTH = " + provider.interests.length); 
     for(int i = 0; i < provider.interests.length; i++) { 
      String interest = provider.interests[i]; 
      mTextChipLayout.add(new Tag(interest)); 
     } 
      return convertView; 
    } 

    @Override 
    public void onChipClick(Chip chip) { 

    } 

} 
+0

il tuo schermo lineare appena sopra il chipview ha il layout verticale. –

+0

@RusheelJain Ho cambiato in orizzontale e ancora la stessa risposta – revipod

risposta

14

ho risolto il problema in modo diverso bit: I sostituito HorizontalScrollView e ListView da un RecyclerView con ciascuna riga come RecyclerView che, come ritengo, è un layout preferito qui.

Ecco il risultato:

enter image description here

(non pagare per molta attenzione a un design :-) brutto)

MainActivity disposizione

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:background="#FFFFFF" 
    android:id="@+id/recyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

MainActivity classe:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RecyclerView chipRecyclerView = (RecyclerView)findViewById(R.id.recyclerView); 
     chipRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 

     ArrayList<String[]> chipsArray = new ArrayList<>(); 
     chipsArray.add(new String[] {"Fitness", "Gaming", "Education","Animals", "Cars"}); 
     ..... 
     chipsArray.add(new String[] {"Education","Animals", "Cars"}); 

     chipRecyclerView.setAdapter(new ListChipsAdapter(chipsArray)); 
    } 
} 

ListChipsAdapter - adattatore per la vista del riciclatore di MainActivity. Gestisce l'elenco di file con chip.

public class ListChipsAdapter extends RecyclerView.Adapter { 

    private ArrayList<String[]> chipsArray; 

    public ListChipsAdapter(ArrayList<String[]> chipsArray) { 
     this.chipsArray = chipsArray; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ChipsViewHolder(new RowChipsView(parent.getContext())); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ((RowChipsView)holder.itemView).setAdapter(new ChipsAdapter(chipsArray.get(position))); 
    } 

    @Override 
    public int getItemCount() { 
     return chipsArray.size(); 
    } 

    private class ChipsViewHolder extends RecyclerView.ViewHolder { 

     public ChipsViewHolder(View itemView) { 
      super(itemView); 
     } 
    } 
} 

RowChipsView - è una classe che rappresenta la particolare singola riga:

public class RowChipsView extends FrameLayout { 

    public RowChipsView(Context context) { 
     super(context); 
     initializeView(context); 
    } 

    private void initializeView(Context context) { 
     LayoutInflater.from(context).inflate(R.layout.single_row, this); 
     ((RecyclerView)findViewById(R.id.recyclerViewHorizontal)).setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); 
    } 

    public void setAdapter(ChipsAdapter adapter) { 
     ((RecyclerView)findViewById(R.id.recyclerViewHorizontal)).setAdapter(adapter); 
    } 
} 

E 'Layout è costituito da un solo RecyclerView:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/recyclerViewHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="56dp"/> 

Ora, ChipsAdapter - l'adattatore che è utilizzato da ogni singola riga:

public class ChipsAdapter extends RecyclerView.Adapter { 

    private String[] chipsArray; 

    public ChipsAdapter(String[] chipsArray) { 
     this.chipsArray = chipsArray; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ChipViewHolder(new ChipView(parent.getContext())); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ((ChipView)holder.itemView).displayItem(chipsArray[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return chipsArray.length; 
    } 

    private class ChipViewHolder extends RecyclerView.ViewHolder { 

     public ChipViewHolder(View itemView) { 
      super(itemView); 
     } 
    } 
} 

Ora, l'ultimo pezzo è un ChipView:

public class ChipView extends FrameLayout { 

    public ChipView(Context context) { 
     super(context); 
     initializeView(context); 
    } 

    private void initializeView(Context context) { 
     LayoutInflater.from(context).inflate(R.layout.chip_view, this); 
    } 

    public void displayItem(String text) { 
     ((TextView)findViewById(R.id.chipTextView)).setText(text); 
    } 
} 

ed è il layout:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:background="@drawable/rounded_background" 
    android:layout_margin="4dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/chipTextView" 
     android:textColor="#FFFFFF" 
     android:textSize="24sp" 
     android:padding="8dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</FrameLayout> 

Ho caricato il progetto al mio set, in modo feel free to check it out!

spero, aiuta.

+0

Wow amico! Grazie mille!!! Ci proverò e tornerò da te! – revipod

+2

Si noti che se si sceglie di inserire la classe ViewHolder di RecyclerAdapter nello stesso file di RecyclerAdapter, è necessario dichiararlo come statico. Altrimenti, prima o poi ti imbatterai in problemi di memoria. –

+0

mi ha aiutato Grazie – Sanjeev