Android में क्षैतिज सूची दृश्य?


215

क्या ListViewक्षैतिज रूप से बनाना संभव है ? मैंने गैलरी दृश्य का उपयोग करके ऐसा किया है, लेकिन चयनित आइटम स्वचालित रूप से स्क्रीन के केंद्र में आता है। मैं उसी स्थान पर चयनित आइटम नहीं चाहता, जिस पर मैंने क्लिक किया था। मैं इस समस्या को कैसे ठीक कर सकता हूं? मेरा विचार ListViewएक क्षैतिज स्क्रॉल के साथ सेट करना था । अपना विचार साझा करें?


1
क्षैतिज सूची बनाने के लिए मेरी पोस्ट के इस लिंक का उपयोग करें। मुझे उम्मीद है कि यह आपकी मदद करेगा।
FAIZ ANWAR

2
@ भारत ने जिस ब्लॉग का उल्लेख किया है उसे हटा दिया गया है
अनिमेष मंगला

आप इस उदाहरण को देख सकते हैं thedeveloperworldisyours.com/android/…
Cabezas

जवाबों:


123

एंड्रॉइड डॉक्यूमेंटेशन के अनुसार RecyclerViewआइटम को सूची में व्यवस्थित करने और क्षैतिज रूप से प्रदर्शित करने का नया तरीका है

लाभ:

  1. चूंकि Recyclerview एडाप्टर का उपयोग करके, ViewHolder पैटर्न स्वचालित रूप से लागू किया जाता है
  2. एनिमेशन करना आसान है
  3. कई और विशेषताएं

अधिक जानकारी के बारे में RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

नमूना:

survivingwithandroid.com

ListViewऊर्ध्वाधर से क्षैतिज बनाने के लिए बस नीचे ब्लॉक जोड़ें

सांकेतिक टुकड़ा

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);

1
यह सबसे अच्छा समाधान होगा यदि लेआउट मैनजर के साथ मुद्दों को Google द्वारा तय किया गया है। code.google.com/p/android/issues/detail?id=74772
पोंसुयम्बु वेल्लादुरई


1
ठीक है, विजेट्स के लिए क्या तरीका है?
व्लादिस्लाव

अन्य एडेप्टर-समर्थित विचारों जैसे कि ListView या GridView के विपरीत, RecyclerView ग्राहक कोड को बच्चे के विचारों के लिए कस्टम लेआउट व्यवस्था प्रदान करने की अनुमति देता है। ये व्यवस्थाएँ RecyclerView.LayoutManager द्वारा नियंत्रित की जाती हैं। फ़ंक्शन के लिए RecyclerView के लिए एक LayoutManager प्रदान किया जाना चाहिए।
योहन एआई

RecyclerView अभी भी आइटम पर क्लिक नहीं कर सकता (RecyclerView.Selection वर्ग का उल्लेख न करें) ListView के रूप में अच्छा और आसान है - यह उन कुछ कारणों में से एक है जो मुझे लगता है कि RecyclerView इस सवाल का सबसे अच्छा जवाब नहीं है।
एडवर्ड किक्सोट

60

पॉल अपने पुस्तकालय के कीड़े को ठीक करने या उपयोगकर्ताओं को स्वीकार करने के लिए परेशान नहीं करता है। इसलिए मैं एक और पुस्तकालय का सुझाव दे रहा हूं जिसमें समान कार्यक्षमता है:

https://github.com/sephiroth74/HorizontalVariableListView

अपडेट करें : 24 जुलाई 2013 को लेखक (sephiroth74) ने एंड्रॉइड 4.2.2 लिस्ट व्यू के कोड के आधार पर पूरी तरह से पुनर्लेखन संस्करण जारी किया। मुझे कहना होगा कि इसमें सभी त्रुटियां नहीं हैं जो पिछले संस्करण में थीं और महान काम करती हैं!


2
यह एक स्वीकृत उत्तर होना चाहिए, 'क्योंकि यह क्षैतिज क्षैतिजता पॉलिस्ट व्यू पॉल की तुलना में बहुत अधिक उन्नत है। उदाहरण के लिए, किसी सूची में स्थान का चयन करने के लिए यह एक उपयुक्त तरीका है, पॉल के पास "TODO: किसी दिन लागू करें" है।
यान.युर्किन

5
ध्यान दें कि इस समाधान के लिए एंड्रॉइड 2.3 या उच्चतर की आवश्यकता है
user1032613

1
sephiroth74 की HorvourVariableListView वही है जो आप इसे होने की उम्मीद करते हैं: Android स्रोत कोड से ListView की एक प्रति जो लंबवत के बजाय क्षैतिज रूप से स्थानांतरित करने के लिए अद्यतन की गई सभी विधियों के साथ है । मैंने अभी तक किसी भी मुद्दे में भाग नहीं लिया है। वहाँ मुझे निर्देशित करने के लिए बहुत बहुत धन्यवाद, मैलाकियाज़!
सिलिथक्रोव

अच्छी तरह से लिपटे जाने के लिए अच्छी तरह से लपेटना अभी भी इस लिबास में समर्थित नहीं है
कल्पेश लखानी

1
अब इसे सही कर दिया गया है
अनिमेष मंगला

28

एक महान समाधान के लिए @Paul जवाब लिंक, लेकिन कोड का उपयोग करने की अनुमति नहीं है onClickListeners आइटम बच्चों पर (कॉलबैक कार्यों कभी नहीं कहा जाता है)। मैं एक समाधान खोजने के लिए कुछ समय से संघर्ष कर रहा हूं और मैंने यहां पोस्ट करने का फैसला किया है कि आपको उस कोड में क्या बदलाव करना है (यदि किसी को इसकी आवश्यकता है)।

dispatchTouchEventओवरराइड ओवरराइड करने के बजाय onTouchEvent। उसी कोड का उपयोग करें dispatchTouchEventऔर विधि को हटाएं (आप दोनों के बीच अंतर को यहां पढ़ सकते हैं http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

फिर, निम्नलिखित कोड जोड़ें जो आइटम बच्चों से घटना को चोरी करने और इसे हमारे पास देने का फैसला करेगा onTouchEvent, या इसे उनके द्वारा नियंत्रित किया जाएगा।

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

अंत में, अपनी कक्षा में चर घोषित करना न भूलें:

private float mInitialX;
private float mInitialY;

13
आप इसे पॉल के लिए एक अनुरोध के रूप में क्यों नहीं भेजते?
क्रिस्टियन

ev.getActionMasked () Android 2.1 प्लेटफ़ॉर्म पर उपलब्ध नहीं है। क्या आप जानते हैं कि इससे कैसे उबरें?
यूजीन पोपोविच

ऐसा लगता है कि मैं int maskedAction = ev.getAction () और MotionEvent.ACTION_MASK का उपयोग कर सकता हूं, जो कि ev.getMaskedAction () के बराबर है
यूजीन

वास्तव में उपयोगी! लेकिन onTouchEvent में कोड बदलने से मुझे एक अजीब ऑफसेट मिला। मैंने इसे डिस्पैचचाउट में रखा और यह पूरी तरह से काम करता है! धन्यवाद
jbc25

jbc25 मैं पुष्टि कर सकता हूं कि इस फिक्स का उपयोग करने पर अजीब कूदता है
यूजीन पॉपोविच

23

चूंकि Google ने एंड्रॉइड सपोर्ट लाइब्रेरी v7 21.0.0 पेश किया है, इसलिए आप क्षैतिज रूप से आइटम स्क्रॉल करने के लिए RecyclerView का उपयोग कर सकते हैं। RecyclerView विजेट ListView का अधिक उन्नत और लचीला संस्करण है।

RecyclerView का उपयोग करने के लिए, बस निर्भरता जोड़ें:

com.android.support:recyclerview-v7:23.0.1

यहाँ एक नमूना है:

public class MyActivity extends Activity {

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

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

RecyclerView के बारे में अधिक जानकारी:


21

यह थोड़ा (बहुत) देर से है, लेकिन मैं इसे पोस्ट कर रहा हूं अगर कोई इसके द्वारा आता है।

एंड्रॉइड L प्रीव्यू के रूप में सपोर्ट लाइब्रेरी में एक RecyclerViewवही है जो आप चाहते हैं।

अभी, आप इसे केवल L प्रीव्यू SDK के माध्यम से प्राप्त कर सकते हैं और आपको इसे सेट करने की आवश्यकता minSdkहै L। लेकिन आप अपने प्रोजेक्ट में सभी आवश्यक फाइलों को कॉपी कर सकते हैं और उन्हें उस तरह से उपयोग कर सकते हैं जब तक कि एल आधिकारिक रूप से बाहर न हो जाए।

आप यहां पूर्वावलोकन डॉक्स डाउनलोड कर सकते हैं

चेतावनी: रिसाइकलर व्यू के लिए एपीआई बदल सकता है और इसमें कीड़े हो सकते हैं।

अपडेट किया गया

क्षैतिज सूची के लिए स्रोत कोड है:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

हाय, यह काम करता है? क्योंकि मैं कोशिश करता हूँ और मैं एक क्षैतिज RecyclerView नहीं बना सकता। क्या आप कुछ कोड डाल सकते हैं? धन्यवाद
Cocorico

बस सेट LinearLayoutManager: - यहाँ देख stackoverflow.com/questions/28460300/...
स्टीफन

19

जार फ़ाइल यहाँ से डाउनलोड करें

अब इसे अपने libs फ़ोल्डर में डालें, इसे राइट क्लिक करें और 'Add as Library' चुनें

अब main.xml में यह कोड डालें

 <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/hlistview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

अब गतिविधि वर्ग में यदि आप छवियों के साथ क्षैतिज सूची चाहते हैं तो यह कोड डालें

  HorizontalListView hListView = (HorizontalListView) findViewById(R.id.hlistview);
    hListView.setAdapter(new HAdapter(this));


 private class HAdapter extends BaseAdapter {

    LayoutInflater inflater;

    public HAdapter(Context context) {
        inflater = LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Const.template.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listinflate, null);
            holder = new HViewHolder();
            convertView.setTag(holder);

        } else {
            holder = (HViewHolder) convertView.getTag();
        }
        holder.img = (ImageView) convertView.findViewById(R.id.image);
        holder.img.setImageResource(Const.template[position]);
        return convertView;
    }

}

class HViewHolder {
    ImageView img;
}

यह किसी भी चयनकर्ता, या किसी भी कस्टम चयनकर्ता का समर्थन नहीं कर रहा है? कोई उपाय?
नितिन मिश्रा

क्या मैं छवियों के बजाय संख्याओं की सरणी जोड़ सकता हूं?
सौरवलहोटी

@BeingSrv हाँ आप कर सकते हैं
सिद्धपुरा अमित

लिबर फोल्डर में डालने के बाद, राइट क्लिक करें और हिट करें 'Add as Library'
एम। उस्मान खान

कैसे पल्स की तरह क्षैतिज सूची के डेवलपर की सूची में, bbcnews कृपया मेरी मदद करें
हर्षा

13

इसका वास्तव में बहुत सरल है : इसके किनारे पर बिछाने के लिए बस सूची दृश्य को घुमाएं

mlistView.setRotation(-90);

फिर बच्चों को फुलाए जाने पर, उन्हें गेटव्यू पद्धति के अंदर होना चाहिए। आप सीधे खड़े होने के लिए बच्चों को घुमाएँ:

 mylistViewchild.setRotation(90);

संपादित करें: यदि आपका ListView रोटेशन के बाद ठीक से फिट नहीं होता है , तो इस तरह से RotateLayout के अंदर ListView रखें :

 <com.github.rongi.rotate_layout.layout.RotateLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:angle="90"> <!-- Specify rotate angle here -->

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
    </ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>

1
मैंने इसे आज़माया है - इतना सरल नहीं। मैंने स्क्रीन की चौड़ाई और ऊंचाई पर घुमाए गए दृश्य को फिट करने का प्रबंधन नहीं किया। और यह एपीआई केवल नए उपकरणों में उपलब्ध है।
मलयाचीज़

घूर्णन करने से पहले, सूची की चौड़ाई को स्क्रीन की ऊँचाई पर सेट करें और स्क्रीन की चौड़ाई के लिए सूची की ऊँचाई सेट करें .. (यदि आप स्क्रीन को भरने के लिए सूची को चाहते हैं) तो सूची को घुमाए जाने से पहले जो भी ऊँचाई और चौड़ाई चाहते हैं उसकी सूची सेट करें। ।
kc ochibili

1
क्या आप कोशिश कर रहे हैं कि आप क्या कहते हैं? मेरे पास और कोई भी काम नहीं है।
मलयाचीस

क्या आपने घूमने के बाद मूल्यों को बदलने की कोशिश की? मैं नहीं देखता कि यह क्यों काम नहीं करना चाहिए। (यदि आप सोच रहे हैं कि आप घूमने के बाद पिछली ऊंचाई और चौड़ाई के मूल्यों को कैसे जानेंगे, तो आप उन्हें घुमाने से पहले एक चर में सहेज सकते हैं और फिर उन्हें घुमाने के बाद उन्हें छोड़ देंगे।
kc ochibili

इस लाइब्रेरी का नया संस्करण ( stackoverflow.com/a/16589629/2075875 ) काम करता है, क्योंकि इसे एंड्रॉइड 2.3 से काम करना चाहिए और सेट्रोटेशन () 3.0 से उपलब्ध है, इसलिए मैं फिर से चक्कर नहीं खेलना चाहता, लेकिन मैं इसे प्रोत्साहित करता हूं आप इसे स्वयं आज़माएँ और वर्किंग कोड प्रस्तुत करें।
मलयाचीस

9

मेरा समाधान बस ViewPagerविजेट का उपयोग करना है । यह केंद्र-लॉक के रूप में नहीं है Galleryऔर इसमें रिसाइकिलिंग व्यू के रूप में अंतर्निहित विशेषताएं हैं (asListView ) के । जब भी आप क्षैतिज स्क्रॉल करने योग्य सूचियों के साथ व्यवहार करते हैं, तो आप Google Play ऐप पर समान दृष्टिकोण देख सकते हैं।

आपको बस PagerAdapterवहां एक-दो बार विस्तार और प्रदर्शन करने की आवश्यकता है :

public class MyPagerAdapter extends PagerAdapter {

    private Context mContext;

    public MyPagerAdapter(Context context) {
        this.mContext = context;
    }

    // As per docs, you may use views as key objects directly 
    // if they aren't too complex
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item, null);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // Important: page takes all available width by default,
    // so let's override this method to fit 5 pages within single screen
    @Override
    public float getPageWidth(int position) {
        return 0.2f;
    }
}

परिणामस्वरूप, आपके पास एडाप्टर के साथ क्षैतिज स्क्रॉल करने योग्य विजेट होगा, जैसे: यहां छवि विवरण दर्ज करें


3
यह ListView की तरह स्क्रॉल करने योग्य है, लेकिन क्षैतिज दिशा में है। एकमात्र अंतर जो मैं देखता हूं: आइटम एक-एक करके स्क्रॉल कर रहे हैं, इसलिए अगले आइटम के बीच में कहीं स्क्रॉल करना संभव नहीं है। लेकिन यह है कि ViewPager कैसे काम करता है।
सुगंधगीत

8

नोट: Android अब RecyclerView का उपयोग करके क्षैतिज सूची दृश्यों का समर्थन करता है, इसलिए अब यह उत्तर संक्षिप्त हो गया है, RecyclerView के बारे में जानकारी के लिए: https://developer.android.com/reference/android/support/v7/widget/RecyclineView

मैंने किसी भी बाहरी क्षैतिज स्क्रॉलव्यू लाइब्रेरी का उपयोग किए बिना इसे करने के लिए एक तर्क विकसित किया है, यहां वह क्षैतिज दृश्य है जिसे मैंने हासिल किया है और मैंने अपना उत्तर यहां पोस्ट किया है: https://stackoverflow.com/a/33301582/5479863

मेरी json प्रतिक्रिया यह है:

{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}

लेआउट फ़ाइल:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5">    
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <HorizontalScrollView
        android:id="@+id/horizontalScroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">    
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

कक्षा फ़ाइल:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        for (int v = 0; v < collectionInfo.size(); v++) {
            /*---------------Creating frame layout----------------------*/

            FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
            layoutParams.rightMargin = getPixelsToDP(10);
            frameLayout.setLayoutParams(layoutParams);

            /*--------------end of frame layout----------------------------*/

            /*---------------Creating image view----------------------*/
            final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
            LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
            imgView.setLayoutParams(lpImage);
            // setting ID to retrieve at later time (same as its position)
            imgView.setId(v);
            imgView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // getting id which is same as its position
                    Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
                    // getting selected category's data list
                    new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
                }
            });
            /*--------------end of image view----------------------------*/

            /*---------------Creating Text view----------------------*/
            TextView textView = new TextView(ActivityMap.this);//create textview dynamically
            textView.setText(collectionInfo.get(v).getCatName());
            FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
            // Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
            textView.setTextColor(Color.parseColor("#43A047"));
            textView.setLayoutParams(lpText);
            /*--------------end of Text view----------------------------*/

            //Adding views at appropriate places
            frameLayout.addView(imgView);
            frameLayout.addView(textView);
            linearLayout.addView(frameLayout);

        }

 private int getPixelsToDP(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        int pixels = (int) (dp * scale + 0.5f);
        return pixels;
    }

ट्रिक जो यहाँ पर काम कर रही है वह आईडी है जिसे मैंने ImageView "imgView.setId (v)" को सौंपा है और इसके बाद onClickListener पर आवेदन करने के बाद मैं फिर से व्यू की आईडी ला रहा हूँ .... मैंने कोड के अंदर भी टिप्पणी की है। यह समझने में आसान है, मुझे आशा है कि यह बहुत उपयोगी हो सकता है ... हैप्पी कोडिंग ... :)

http://i.stack.imgur.com/lXrpG.png


1
मैंने सम्पूर्ण विवरण यहाँ संपादित और पोस्ट किया है, सुझाव के लिए धन्यवाद :)
अब्दुल अज़ीज़

हैलो अपने कोड के लिए धन्यवाद आप विधि पोस्ट कर सकते हैं getPixelsToDP()?
स्किज़ो-ओज़स

@ स्किज़ो मैंने जावा कोड के अंत में उस पद्धति को जोड़ा है, एक नज़र है
अब्दुल अज़ीज़

6

यह एक जवाब का ज्यादा नहीं है, लेकिन एक क्षैतिज स्क्रॉल दृश्य का उपयोग करने के बारे में कैसे ?


3
यह काम करता हैं। लेकिन अगर मेरे पास बड़ी संख्या में आइटम हैं तो एडाप्टर प्रकार के सामान का उपयोग नहीं कर सकते हैं और घटनाओं पर क्लिक कर सकते हैं।
प्रवीण


5

आप समर्थन पुस्तकालय में RecyclerView का उपयोग कर सकते हैं। RecyclerView सूची दृश्य का एक सामान्यीकृत संस्करण है जो समर्थन करता है:

  • आइटम स्थिति के लिए एक लेआउट प्रबंधक
  • सामान्य आइटम संचालन के लिए डिफ़ॉल्ट एनिमेशन

एंड्रॉइड रिसाइक्लर व्यू डॉक्स


इस लेट डेट का असली जवाब यही है। लेकिन अभी भी यह तैयार नहीं है और अभी भी 'पूर्वावलोकन' में है
मार्टिन

3

मैंने इस समस्या के समाधान के लिए बहुत खोज की है। संक्षिप्त जवाब है, कोई अच्छा उपाय नहीं है, बिना निजी तरीकों और उस तरह की चीज को देखे बिना। मुझे जो सबसे अच्छी चीज मिली, वह यह थी कि इसका विस्तार करके खुद को स्क्रैच से लागू किया जाए AdapterView। यह बहुत दयनीय है। क्षैतिज सूची दृश्य के बारे में मेरा SO प्रश्न देखें ।


अफसोस की बात है कि आपका जवाब सही है। यहां तक ​​कि Google यह भी पुष्टि करता है कि क्षैतिज सूची के लिए एकमात्र तरीका गैलरी है। लेकिन गैलरी एक क्षैतिज सूची के रूप में ही नहीं है। क्या आप अपना कोड साझा करने के लिए तैयार हैं? क्या आप विचारों को रीसायकल करते हैं?
पैट्रिक बूसे

1
दुर्भाग्य से कोड मेरी कंपनी के लिए लिखा गया था, इसलिए मालिकाना है। हालांकि, मुझे उम्मीद है कि इसे फिर से लिखने के लिए आने वाले महीनों में कुछ खाली समय मिल जाएगा (मूल कार्यान्वयन बहुत अस्थिर है) और इसे सार्वजनिक डोमेन पर जारी किया जाएगा। मैं आपको यह भी बता सकता हूं कि मैंने सोनी एरिक्सन से इस डेमो को शुरू करके , सभी 'x' को 'y' और सभी 'चौड़ाई' को 'ऊँचाई' में बदल दिया। फिर मैंने 3 डी ट्रांसफ़ॉर्म को हटा दिया और स्टॉप-ए-एंड-एंड व्यवहार जोड़ा।
नील ट्राफिक

@ नील ट्रफ्ट आपने वस्तुओं की स्थिति कैसे तय की? और अंत में रुकने का क्या?
एड्रियन मगदस

ईमानदारी से, यह वास्तव में केवल बहुत अधिक अनुमान था। इसे सही होने में लंबा समय लगा, और मुझे यकीन है कि एक बेहतर तरीका है। लेकिन मूल आधार, fillListDown()विधि में है, आपको अंतिम सूची आइटम के निचले किनारे का ट्रैक रखने की आवश्यकता है। लेकिन आप यह नहीं जानते कि वह किनारा तब तक नहीं है जब तक कि आप वास्तव में अंतिम आइटम (एडॉप्टर .getCount () - 1) नहीं बनाते हैं। इसलिए आप तब तक इंतजार करते हैं जब तक कि वह आइटम बन नहीं जाता है और तब आप किनारे के स्थान को स्टोर कर सकते हैं। एक बार जब आप यह जान लेते हैं, तो आप यह सुनिश्चित कर सकते हैं कि mListTop कभी भी 0 से कम न हो और सूची की ऊँचाई से अधिक न हो।
नील ट्राफ

1
यदि आपको वास्तव में, वास्तव में, ABSOLUTELY को एक क्षैतिज सूची की आवश्यकता नहीं है, तो मैं आपको गैलरी देने या उसका उपयोग करने के लिए प्रोत्साहित करूंगा।
नील ट्रफ्ट

3

मुझे अपनी एक परियोजना के लिए भी ऐसा ही करना था और मैंने अपना खुद का लेखन भी समाप्त कर दिया। मैंने इसे कहा है HorzListView अब मेरे ओपन सोर्स Aniqroid लाइब्रेरी का हिस्सा है ।

http://aniqroid.sileria.com/doc/api/ (नीचे दिए गए डाउनलोड देखें या अधिक डाउनलोड विकल्प देखने के लिए Google कोड प्रोजेक्ट का उपयोग करें: http://code.google.com/p/aniqroid/downloads/list )

कक्षा का प्रलेखन यहाँ है: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


मैं क्रमिक रूप से स्क्रॉल स्थिति कैसे सेट कर सकता हूं?
दीमा पोर्टेंको

setSelection () विधि है, लेकिन लागू नहीं हो सकता है 100%। कोशिश करो।
सिलेरिया

1

मेरे आवेदन के लिए, मैं एक क्षैतिज क्षैतिज नियंत्रण रेखा का उपयोग करता हूं, जिसमें रैखिकयरआउट के अंदर है, जिसमें क्षैतिज के लिए उन्मुखीकरण है। अंदर छवियां जोड़ने के लिए, मैं गतिविधि के अंदर ImageView बनाता हूं और उन्हें अपने रेखीय लयआउट में जोड़ता हूं। उदाहरण के लिए:

<HorizontalScrollView 
        android:id="@+id/photo_scroll"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="horizontal"
        android:visibility="gone">

        <LinearLayout 
            android:id="@+id/imageview_holder"
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="match_parent">

        </LinearLayout>
    </HorizontalScrollView>

यह मेरे लिए पूरी तरह से ठीक काम करता है। गतिविधि में मुझे जो कुछ करना है वह नीचे दिए गए कोड की तरह है:

LinearLayout imgViewHolder = findViewById(R.id.imageview_holder);
ImageView img1 = new ImageView(getApplicationContext());
//set bitmap
//set img1 layout params
imgViewHolder.add(img1);
ImageView img2 = new ImageView(getApplicationContext());
//set bitmap
//set img2 layout params
imgViewHolder.add(img2); 

जैसा कि मैंने कहा कि मेरे लिए काम करता है, और मुझे आशा है कि यह किसी को भी इसे प्राप्त करने में मदद करता है।


0

अच्छी तरह से आप हमेशा अपने पाठ्यपुस्तकों आदि को गतिशील रूप से बना सकते हैं और अपने onclicklisteners सेट कर सकते हैं जैसे आप एक एडेप्टर के साथ करेंगे


आपका मतलब क्या है? मैं तुम्हें नहीं मिल सकता? कृपया अपने विचार के बारे में कोड स्निपेट पोस्ट करें?
प्रवीण

कृपया मुझे "क्षैतिज सूची-निर्धारण" का उद्देश्य बताएं, क्या इसमें जटिल / बहु विचार होंगे? जैसे 2 टेक्स्टबॉक्स 1 प्रगतिबार? या सीधे सादे पाठ को कहें? क्या आपके पास उस दृश्य के अंदर तत्वों की एक निश्चित संख्या है या आप इसे गतिशील रूप से बदलना चाहते हैं? मुझे इनका उत्तर दो और मैं
जुएल

मैं क्षैतिज पाठ गैलरी करना चाहता हूं। लेकिन चयनित आइटम डिफ़ॉल्ट रूप में केंद्र में आता है। मैं चयनित आइटम बनना चाहता हूं जहां मुझे उस पर क्लिक करना चाहिए। कृपया मेरे पोस्ट भी देखें: stackoverflow.com/questions/3237566/text-gallery-on-android और stackoverflow.com/questions/3318617/…
प्रवीण

0

होरिजोंटलिस्टस्ट व्यू तब काम नहीं कर सकता जब एडॉप्टर में डेटा दूसरे थ्रेड में शामिल हो। सब कुछ UI थ्रेड पर 100% चलता है। यह मल्टीथ्रेड में एक बड़ी समस्या है। मैं का उपयोग कर लगता है कि HorizontialListView अपने problem.HorzListView लिए सबसे अच्छा समाधान के लिए एक बेहतर way.You सिर्फ adapter.Then सब कुछ के बारे में कोड को संशोधित neednot HorzListView.You साथ अपने पिछले गैलरी की जगह है नहीं है जिस तरह से चला जाता है आप hope.See https: // stackoverflow.com/a/12339708/1525777 HorzListView के बारे में।


0

मैंने अपनी परियोजना में क्षैतिज सूची अनुक्रम का उपयोग किया था और मुझे अच्छे परिणाम मिले। मुझे शुरू में देवस्मृति पुस्तकालय का उपयोग किया गया था लेकिन इसने मुझे कुछ मुद्दे दिए। तो सबसे अच्छा तरीका है क्षैतिज सूची लिंक का उपयोग करने के रूप में यह मेरे मुद्दों को बरामद किया और मैं भी हाल ही में इस पुस्तकालय का उपयोग कर Google PlayStore पर अपना ऐप लॉन्च किया और उपयोगकर्ताओं से अच्छी प्रतिक्रिया मिली। इसलिए मैं आपको उसी पुस्तकालय का उपयोग करने की सलाह देता हूं, जिसका मैंने ऊपर उल्लेख किया था, जो क्षैतिज रूप से सूची-बद्ध को दिखाने के लिए है। का आनंद लें :)


0

इसके लिए एक महान पुस्तकालय है, जिसे TwoWayView कहा जाता है , इसे लागू करना बहुत आसान है, बस प्रोजेक्ट लाइब्रेरी को अपने कार्य स्थान में शामिल करें और इसे अपने मूल प्रोजेक्ट में लाइब्रेरी प्रोजेक्ट के रूप में जोड़ें, और फिर निम्नलिखित चरणों का पालन करें जो मूल रूप से यहां उल्लिखित हैं :

सबसे पहले, आइए (Res / मान / style.xml) में ListView (क्षैतिज या ऊर्ध्वाधर) के अभिविन्यास को इंगित करते हुए एक शैली जोड़ें:

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

फिर,

अपने लेआउट XML में, TwoWayView जोड़ने के लिए निम्नलिखित कोड का उपयोग करें:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

और अंत में, बस इसे घोषित करें और किसी भी नियमित की तरह इसका सामना करें ListView:

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

सभी विधियां ListViewयहां हमेशा की तरह काम करेंगी, लेकिन मेरे द्वारा देखा गया केवल एक ही अंतर है, जो कि च्वाइस मोड सेट करते समय, विधि setChoiceModeएक intमान नहीं लेती है, लेकिन enumकॉल से एक मान होता है ChoiceMode, ऐसा list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);ही होगा lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE


1
मैंने यह कोशिश की - लेकिन यह मुझे मेरे अपने ArrayAdapter <PreviewImage>
DeNitE Appz

-1

आप लेआउट XML को शामिल करने और छवियों को जोड़ने के लिए ViewFlipper का उपयोग कर सकते हैं, प्रत्येक लेआउट XML के लिए सूची देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.