2015-12-24 27 views
5

के साथ ListView मैं एक सूचीदृश्य बनाने की कोशिश कर रहा हूं जिसमें पंक्तियों में से प्रत्येक के रूप में एक क्षैतिज स्क्रॉलव्यू शामिल है। मैं तत्वों को ऊर्ध्वाधर रूप से रेखांकित करना चाहता हूं, इसलिए यदि कुछ निश्चित वस्तुएं हों तो दृश्य स्क्रॉल करने योग्य हो जाएगा।क्षैतिज स्क्रॉल व्यू

हालांकि यह इस तरह दिख रहा है।

enter image description here

मैं निम्नलिखित एक्सएमएल यह दृश्य

Adapter.java के दृश्य जोड़ने के लिए मेरी एडाप्टर है बढ़ा-चढ़ाकर हूँ

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> 

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

चिपव्यू के ऊपर बस आपके लाइनरलेआउट में लेआउट लंबवत है। –

+0

@RusheelJain मैं क्षैतिज में बदल गया और अभी भी वही उत्तर – revipod

उत्तर

14

मैं थोड़ा अलग तरह से अपनी समस्या का समाधान: मैं एक RecyclerView जो, के रूप में मेरा मानना ​​है कि, एक पसंदीदा लेआउट यहाँ है के रूप में प्रत्येक पंक्ति के साथ एक RecyclerView द्वारा HorizontalScrollView और ListView बदल दिया।

यहाँ एक परिणाम है:

enter image description here

(एक बदसूरत डिजाइन :-) के लिए अधिक ध्यान करने के लिए भुगतान नहीं करते हैं)

MainActivity लेआउट

<?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 वर्ग:

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 - MainActivity के रीसाइक्लर व्यू के लिए एडाप्टर। यह चिप्स के साथ पंक्तियों की सूची का प्रबंधन करता है। एडाप्टर है जो -

<?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"/> 

अब, ChipsAdapter:

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); 
    } 
} 

यह लेआउट केवल एक RecyclerView से मिलकर कर रहा है है: -

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 एक वर्ग जो विशेष रूप से एकल पंक्ति का प्रतिनिधित्व करता है प्रत्येक पंक्ति द्वारा उपयोग किया जाता है:

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); 
     } 
    } 
} 

अब, पिछले टुकड़ा एक 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); 
    } 
} 

और यह लेआउट है: feel free to check it out!

मुझे आशा है कि

<?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> 

मैं अपने ड्रॉपबॉक्स पर परियोजना अपलोड कर दिया है, इसलिए, यह मदद करता है।

+0

वाह दोस्त! बहुत बहुत धन्यवाद!!! मैं कोशिश करूँगा और आपसे वापस आऊंगा! – revipod

+2

ध्यान दें कि यदि आप अपने रीसाइक्लर एडाप्टर के व्यूहोल्डर क्लास को उसी फ़ाइल में अपने रीसाइक्लिंग एडाप्टर के रूप में रखना चुनते हैं, तो आपको इसे स्थैतिक घोषित करना चाहिए। अन्यथा आप जल्दी या बाद में स्मृति समस्याओं में भाग लेंगे। –

+0

इससे मुझे धन्यवाद मिली – Sanjeev

संबंधित मुद्दे