কাস্টম নির্বাচকের মাধ্যমে আইটেমের পটভূমি তালিকাভুক্ত করুন


98

তালিকার নির্বাচকের মাধ্যমে প্রতিটি লিস্টভিউ আইটেমটিতে একটি কাস্টম পটভূমি প্রয়োগ করা সম্ভব?

ডিফল্ট নির্বাচনকারী ক্ষেত্রে ক্ষেত্রে সুনির্দিষ্ট @android:color/transparentকরে state_focused="false", তবে কিছু কাস্টম ড্রয়যোগ্যতে এটি পরিবর্তন করা বাছাই করা আইটেমগুলিকে প্রভাবিত করে না। রোমেন গাই এই উত্তরে প্রস্তাবিত বলে মনে হচ্ছে এটি সম্ভব।

আমি বর্তমানে প্রতিটি দৃশ্যে একটি কাস্টম ব্যাকগ্রাউন্ড ব্যবহার করে এবং আইটেমটি নির্বাচিত / ফোকাসড / যা কিছু নির্বাচক দেখানো হয়েছে তা লুকিয়ে রেখে একই প্রভাবটি অর্জন করছি, তবে এটি সমস্ত জায়গায় এক জায়গায় সংজ্ঞায়িত করা আরও মার্জিত হবে।

রেফারেন্সের জন্য, এটি এই নির্বাচক যা আমি এই কাজটি করার চেষ্টা করে যাচ্ছি:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="false"
        android:drawable="@drawable/list_item_gradient" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true" android:state_enabled="false"
        android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true" android:state_enabled="false"
        android:drawable="@drawable/list_selector_background_disabled" />

    <item android:state_focused="true" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />

    <item android:state_focused="true"
        android:drawable="@drawable/list_selector_background_focus" />

</selector>

এবং এইভাবেই আমি নির্বাচককে সেট করছি:

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@drawable/list_selector_background" />    

কোনো সাহায্যের জন্য আগাম ধন্যবাদ!

উত্তর:


128

আমি নিজে নিজে হতাশ হয়েছি এবং শেষ পর্যন্ত এটি সমাধান করেছি। রোমেন গায়ের ইঙ্গিত হিসাবে, আরও একটি রাষ্ট্র রয়েছে "android:state_selected", যা আপনাকে অবশ্যই ব্যবহার করা উচিত। আপনার তালিকা আইটেমের পটভূমির জন্য একটি রাজ্য অঙ্কনযোগ্য ব্যবহার করুন, এবং listSelectorআপনার তালিকার জন্য আলাদা রাজ্য আঁকতে ব্যবহার করুন:

list_row_layout.xML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/listitem_background"
    >
...
</LinearLayout>

listitem_background.xML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@color/android:transparent" />
    <item android:drawable="@drawable/listitem_normal" />
</selector>

লেআউট.এক্সএমএল যা তালিকাভিউতে অন্তর্ভুক্ত:

...
<ListView 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:listSelector="@drawable/listitem_selector"
   />
...

listitem_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/listitem_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/listitem_selected" />
</selector>

4
গভীরতর প্রতিক্রিয়ার জন্য ধন্যবাদ। আমি আমার প্রশ্নে যেমন উল্লেখ করেছি, এই মুহূর্তে আমি ঠিক এটিই করছি এবং এটি বেশ ভালভাবে কাজ করে।
শিলগাপির

দুর্ভাগ্যক্রমে, আমার তালিকার ভিউটি কাস্টমাইজ করতে আমার এখনও সমস্যা হচ্ছে। আমি আমার নির্দিষ্ট সমস্যাগুলি এখানে পোস্ট করেছি: stackoverflow.com/questions/5426385/… ; আপনার যে কোনও ইনপুট থাকতে পারে আমি তার প্রশংসা করব।
নমাদ 311

আপনি ব্যাকগ্রাউন্ড হিসাবে প্যাডিং সহ 9-প্যাচ ড্রয়াবল ব্যবহার করলে এটি কার্যকর হয় না। আমি চূড়ান্ত সমাধানটি পেয়েছি, আমি মনে করি, আমার উত্তরটি দেখুন
Michał K

এটি আইসিএস-পরবর্তী পোস্টগুলির জন্য কাজ করে তবে জিঞ্জারব্রেডের জন্য পুরো তালিকা টিপানো বা নির্বাচিত অঙ্কনীয় রঙযুক্ত।
গানার

প্রি-আইসিএসের কোনও সমাধান আছে কি?
লোনি-লোকলি

78

প্লেগ্রাউন্ড হিসাবে প্যাডিং সহ আপনার যখন 9-প্যাচ অঙ্কনযোগ্য থাকে তখন ডিজিএলএমটিএন দ্বারা সমাধান কাজ করে না। অদ্ভুত জিনিসগুলি ঘটে, আমি এটি সম্পর্কে কথা বলতে চাই না, যদি আপনার কোনও সমস্যা থাকে তবে আপনি সেগুলি জানেন।

এখন, আপনি যদি বিভিন্ন রাজ্য এবং 9-প্যাচের ড্রয়াবল (এটি কোনও অঙ্কনযোগ্য এবং রঙের সাথে কাজ করবে), আমার মনে হয় আপনি 2 টি জিনিস করতে হবে:

  1. তালিকার আইটেমগুলির জন্য নির্বাচক সেট করুন।
  2. তালিকার জন্য ডিফল্ট নির্বাচক থেকে মুক্তি পান।

আপনার যা করা উচিত তা প্রথম সারি_সিলিটর.এক্সএমএল সেট করুন:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" 
     android:state_pressed="true" android:drawable="@drawable/list_item_bg_pressed" />
    <item android:state_enabled="true"
     android:state_focused="true" android:drawable="@drawable/list_item_bg_focused" />
    <item android:state_enabled="true"
     android:state_selected="true" android:drawable="@drawable/list_item_bg_focused" />
    <item
     android:drawable="@drawable/list_item_bg_normal" />
</selector>

ভুলবেন না android:state_selected। এটি android:state_focusedতালিকার মতো কাজ করে তবে এটি তালিকা আইটেমের জন্য প্রয়োগ করা হয়।

এবার আইটেমগুলিতে সিলেক্টরটি প্রয়োগ করুন (row.xML):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/row_selector"
>
...
</RelativeLayout>

তালিকার জন্য স্বচ্ছ নির্বাচনকারী করুন:

<ListView
    android:id="@+id/android:list"
    ...
    android:listSelector="@android:color/transparent"
    />

এটি জিনিস করা উচিত।


4
+1, আমি আপনার উত্তরটি আগে দেখতে পাইনি, আমি নিজে থেকে একই ফলাফলটি পেয়ে এসেছি। তবে 9-প্যাচের ড্রয়াবল সম্পর্কে উল্লেখ করার জন্য ধন্যবাদ আমি নিশ্চিত যে এটি আমার ভবিষ্যতের বাস্তবায়নে কার্যকর হতে পারে। এটি সেরা উত্তর হওয়া উচিত কারণ এই পদ্ধতিটি পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য।
আইজ্যাকসিজনারস

28
আমি দুঃখিত, তবে এই ধরণের জিনিস যা কখনও কখনও এই খারাপ ইউআই এপিসগুলিকে কেন এত কৃপণ হতে হয় তা ভাবায়। অ্যান্ড্রয়েডের এখনও অনেক কিছু অতিক্রম করতে হবে। এই ধরনের মৌলিক জিনিসগুলি এমন পিআইটিএ হওয়া উচিত নয়।
গুব্যাট্রন

4
+1 আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ। এত বেসিক কিছু অর্জন করতে এই সমস্ত হুপের মধ্য দিয়ে ঝাঁপ দাও। এই সমস্ত রাজ্য এত বিভ্রান্তিকর।
মরিটজ

4
অ্যান্ড্রয়েডের পরিবর্তে: listSelector = "@ অঙ্কনযোগ্য / তালিকা_নির্বাচক" কেবল অ্যান্ড্রয়েড লিখুন: listSelector = "@ Android: রঙ / স্বচ্ছ" transparent অতিরিক্ত list_selector.xML এর প্রয়োজন নেই।
সোফি সফ্টওয়্যার এলএলসি

4
সঠিক, অ-বিনষ্টকারী তালিকা নির্বাচনকারী আপনার নিজের এক্সএমএল নির্বাচকের পরিবর্তে কেবলমাত্র @ অ্যান্ড্রয়েড হতে পারে: রঙ / স্বচ্ছ হতে পারে। সবেমাত্র চেষ্টা করে দেখেছি। যে জিনিসটি কাজ করে না তা হ'ল @ নাল, যা আমাকে অবাক করে কারণ এর মধ্যে উল্লেখ করা উচিত: "কোনও তালিকা নির্বাচক নেই" এবং তালিকা নির্বাচকটি আইটেমটির পিছনে টানা হওয়ায় কিছুই আঁকতে হবে না। তবে এটি কার্যকর হয় না, ডিফল্ট নির্বাচক তখন ফিরে আসেন ...
জোর্ডিড

17

আপনার তালিকার দর্শন সারিগুলির জন্য কখনই কোনও "পটভূমি রঙ" ব্যবহার করবেন না ...

এটি প্রতিটি নির্বাচক ক্রিয়াকে ব্লক করবে (আমার সমস্যা ছিল!)

শুভকামনা!


4
এটা সত্য নয়। কোনও পটভূমি হিসাবে কেবল কোনও নির্বাচককে ব্যবহার করুন, কোনও স্থির রঙ বা অঙ্কনযোগ্য নয়
মাইকে কে

এটি "ব্যাকগ্রাউন্ড রঙ" বলতে চাইছিল। আপনার কথায় সম্পূর্ণরূপে গ্রহণ করুন।
সিভি 2

আমি এখানে এসেছি কারণ আমার এখন একজন নির্বাচক দরকার যা আমি setBackgroundColor"রঙ" দিয়ে ব্যবহার করেছি । দীর্ঘশ্বাস ফেলুন ... কোনও নির্বাচকের সাথে আপনার এপিআই সংস্করণটি ব্যবহার করুন setBackgroundবা setBackgroundDrawableঅনুযায়ী করুন ।
এপিকপান্ডাফোরস

5

অ্যান্ড্রয়েড বিকাশকারী ব্লগের "কেন আমার তালিকাটি কালো? একটি অ্যান্ড্রয়েড অপ্টিমাইজেশন" নিবন্ধটিতে স্ক্রোল করার সময় তালিকার পটভূমি কেন কালো হয়ে যায় তার একটি বিশদ ব্যাখ্যা রয়েছে। সহজ উত্তর: আপনার তালিকায় স্বচ্ছ (# 00000000) তে ক্যাশে কালার হিন্ট সেট করুন।


4
একটি অনুকরণীয় সরলতা কিন্তু এটি খুব ভাল কাজ করে। রোমেন গাইয়ের জন্য ধন্যবাদ ... <লিস্টভিউ ... অ্যান্ড্রয়েড: ক্যাশে কালারহিন্ট = "# 00000000"> </ListView> সবই!
এরিক জ্যোই

রোমেন গাইকে ধন্যবাদ দেবেন না। তিনি সমস্যার অংশ। এর মতো কোনও ওএসে এতগুলি "লুকানো কৌশল" বা অন্যান্য হ্যাক থাকা উচিত নয়। যদিও আমি অ্যান্ড্রয়েডকে ভালবাসি, অন্য এসডিকে (এমনকি আরও কম / কম পরিপক্ক!) এর সাথে তুলনা করার সময় এটি ডগক্র্যাপের একটি বৃহত স্টিমিং গাদা।
স্ট্যাক ওভারফ্লো হয়েছে

5

এটি যথেষ্ট, যদি আপনি প্রবেশ করেন list_row_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/listitem_background">... </LinearLayout>

listitem_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/dark" android:state_pressed="true" />
    <item android:drawable="@color/dark" android:state_focused="true" />
    <item android:drawable="@android:color/white" />
</selector>

4
দুর্দান্ত ... সহজ উদাহরণ
শিহাব উদ্দিন

4
এবং তালিকা
দর্শকের


4

আপনি একটি থিম লিখতে পারেন:

<pre>

    android:name=".List10" android:theme="@style/Theme"

থিম.এক্সএমএল

<style name="Theme" parent="android:Theme">
        <item name="android:listViewStyle">@style/MyListView</item>
</style>

styles.xML

 <style name="MyListView" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/my_selector</item>

আমার_নির্বাচক আপনার পছন্দসই নির্বাচক হতে চান আমি দুঃখিত আমি আমার কোড লিখতে জানি না


সহায়তার জন্য ধন্যবাদ, তবে এটি নির্বাচকের মাধ্যমে ডিফল্ট তালিকাভুক্ত ব্যাকগ্রাউন্ড সেট করতে সরাসরি সহায়তা করে না।
শিলগাপির

3

আমি সর্বদা একই পদ্ধতি ব্যবহার করি এবং এটি প্রতিবার, যেখানেই ব্যবহৃত হয়: আমি কেবল এই জাতীয় নির্বাচক ব্যবহার করি

<item android:state_activated="true"  android:color="@color/your_selected_color" />
<item android:state_pressed="true" android:color="@color/your_pressed_color" />
<item android:color="@color/your_normal_color"></item>

এবং তালিকাভিউতে সেট করুন (এটি কাজ করে এটি করা খুব গুরুত্বপূর্ণ) বৈশিষ্ট্যটি

android:choiceMode="singleChoice"

পাঠ্য রঙের জন্য সবেমাত্র রঙ ফোল্ডারে রাখুন (গুরুত্বপূর্ণ, অঙ্কনযোগ্য ফোল্ডার নয়!) এর মতো একটি নির্বাচক

<item android:state_activated="true"  android:color="@color/your_selected_textColor" />
<item android:state_pressed="true" android:color="@color/your_pressed_textColor" />
<item android:color="@color/your_normal_textColor"></item>

এটি একটি নমুনা সারি টেম্পলেট

<ImageView
    android:id="@+skinMenu/lblIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:src="@drawable/menu_catalog" />

<TextView
    android:id="@+skinMenu/lblTitle"
    style="@style/superlabelStyle"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginLeft="20dp"
    android:gravity="center_vertical"
    android:text="test menu testo"
    android:textColor="@color/menu_textcolor_selector"
    android:textSize="20dp"
    android:textStyle="bold" />

ক্লান্তিকর কাজের ব্যতিরেকে সবকিছুই দেখায়। এই সাহায্য আশা করি


2

আমি নিজেও নির্বাচকের মাধ্যমে আপনার পছন্দসই প্রভাবটি কীভাবে অর্জন করব তা নিশ্চিত নই - সর্বোপরি সংজ্ঞা অনুসারে পুরো তালিকার একজন নির্বাচক আছেন।

তবে আপনি নির্বাচনের পরিবর্তনের উপর নিয়ন্ত্রণ পেতে এবং যা খুশি তা আঁকতে পারেন। ইন এই নমুনা প্রকল্প , আমি নির্বাচক স্বচ্ছ করতে এবং নির্বাচিত আইটেমের উপর একটি বার আঁকা।


প্রকৃতপক্ষে, সেখানে কেবলমাত্র একজন সর্বাধিক নির্বাচক থাকার বিষয়টি মোটামুটি বোঝায়। আমি অনুমান করি আমি <item android:state_focused="false" android:drawable="@android:color/transparent" />ডিফল্ট নির্বাচকটিতে ধারাটির অস্তিত্ব দেখে কিছুটা বিভ্রান্ত (বা ছিলাম) ।
শিলগাপির

চিহ্নিত করুন, চারদিকে খেলুন (গিলের মতো একই সমস্যা হ'ল) ​​আমি আপনার সমাধানটি চেষ্টা করেছি, এটি কেবলমাত্র ট্র্যাক বলের জন্যই আংশিক, যখন আপনি কেবল স্পর্শ ব্যবহার করে আইটেমগুলি স্পর্শ করেন তখন অনিমিলেক্টড বলা হয় এবং আইটেম ক্লিক করা হয় না, যদি আপনি এই ধরণের কিছু চান তবে সম্ভবত আপনাকে তালিকাভিউয়ের মধ্যে বাছাই করা এবং চাপা থাকা অবস্থানগুলির ট্র্যাক রাখতে হবে এবং আইটেমের মধ্যে যা আপনার প্রয়োজন তা আঁকতে হবে (এটি কাস্টম ভিউ করুন) এবং তালিকাভিউয়ের প্রেরণড্রেতে।
কোডসক্রাইবার

@ কোডসক্রাইবার: "যখন আপনি কেবল স্পর্শ ব্যবহার করে আইটেমগুলি স্পর্শ করেন এবং অন আইটেমিক্লিকড বরখাস্ত করা হয় তখন কিছুই কিছুই নির্বাচিত হয় না" - এটি নিখুঁতভাবে স্বাভাবিক আচরণ, কারণ নির্বাচনের সাথে স্পর্শের কোনও যোগসূত্র নেই।
কমন্সওয়্যার

-3

ফ্রস্টওয়্যারের দল এখানে।

সমস্ত নির্বাচক ক্র্যাপ এপিআই প্রত্যাশার মতো কাজ করে না। এই থ্রেডে উপস্থাপিত সমস্ত সমাধানগুলি ভাল না করে চেষ্টা করার পরে, আমরা কেবল তালিকাভিউ আইটেমটি স্ফীত করার মুহুর্তে সমস্যাটি সমাধান করেছি।

  1. আপনার আইটেমটি স্থিতিশীল রয়েছে তা নিশ্চিত করুন, আমরা মেনু আইটেমের সদস্য ভেরিয়েবল হিসাবে এটি করেছি (বুলিয়ান নির্বাচিত)

  2. আপনি যখন স্ফীতণ করবেন তখন অন্তর্নিহিত আইটেমটি নির্বাচিত কিনা তা জিজ্ঞাসা করুন, যদি তাই হয় তবে আপনি ব্যাকগ্রাউন্ড হিসাবে যে অঙ্কনযোগ্য উত্সটি চান তা সেট করুন (এটি 9 প্যাচ বা যাই হোক না কেন)। নিশ্চিত হয়ে নিন যে আপনার অ্যাডাপ্টারটি এ সম্পর্কে অবগত এবং এটি যখন কোনও কিছু নির্বাচন করা হয়েছে তখন এটি notifDataChanged () কল করে।

        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = act.getLayoutInflater();
            rowView = inflater.inflate(R.layout.slidemenu_listitem, null);
            MenuItemHolder viewHolder = new MenuItemHolder();
            viewHolder.label = (TextView) rowView.findViewById(R.id.slidemenu_item_label);
            viewHolder.icon = (ImageView) rowView.findViewById(R.id.slidemenu_item_icon);
            rowView.setTag(viewHolder);
        }
    
        MenuItemHolder holder = (MenuItemHolder) rowView.getTag();
        String s = items[position].label;
        holder.label.setText(s);
        holder.icon.setImageDrawable(items[position].icon);
    
        //Here comes the magic
        rowView.setSelected(items[position].selected);
    
        rowView.setBackgroundResource((rowView.isSelected()) ? R.drawable.slidemenu_item_background_selected : R.drawable.slidemenu_item_background);
    
        return rowView;
    }
    

নির্বাচকরা আসলে কাজ করতে পারলে এটি সত্যিই দুর্দান্ত লাগবে, তাত্ত্বিকভাবে এটি একটি দুর্দান্ত এবং মার্জিত সমাধান, তবে মনে হচ্ছে এটি ভেঙে গেছে। KISS।


আমি এই সমাধানটি চেষ্টা করতে চাই, আপনি কি আরও বিশদ বিবরণ বা একটি সম্পূর্ণ সমাধান দিতে পারেন? ধন্যবাদ
অ্যান্ড্রু ল্যাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.