天道酬勤,学无止境

如何在自定义 listView 上制作自定义 listSelector(How to make custom listSelector on custom listView)

问题

我想弄清楚如何为我的 listView 设置自定义 listSelector。 该代码或多或少是从适用于 stackoverflow 中的其他人的解决方案中复制和粘贴的,但对我不起作用。

当我打开 CAB 模式时,我可以选择和取消选择项目,并且我在 CAB 导航栏中看到所选项目的数量,但我在列表中看不到任何指示。 我想看看选择了哪些项目。 知道为什么它不起作用吗?

布局/category_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/categories_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ListView
            android:id="@+id/category_browser"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:dividerHeight="1dp"
                    android:listSelector="@drawable/list_selector"
                    android:drawSelectorOnTop="true"
            tools:listitem="@layout/category_list_item" >
    </ListView>
    <include layout="@layout/ad"/>
</LinearLayout>

布局/category_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.fletech.smartbaby.api.CheckableLinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/category_browser_list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="fill"
        android:clickable="true"
        android:gravity="fill"
        android:orientation="horizontal">
        <ImageView
                android:id="@+id/category_item_icon"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:layout_gravity="fill"
                android:layout_weight="0"
                        android:background="#ffffff"
                android:src="@drawable/ic_launcher" />
        <TextView
                android:id="@+id/category_browser_list_title"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical|start"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                        tools:text="Category name"
                android:textColor="#000000"
                android:textSize="24sp" />

        <include layout="@layout/category_features"
            android:layout_centerInParent="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            />

        <include layout="@layout/category_status"
            android:layout_centerInParent="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            />
</com.fletech.smartbaby.api.CheckableLinearLayout>

drawable/list_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#40777777"/>
        </shape>
    </item>
    <item android:state_long_pressable="true">
        <shape android:shape="rectangle">
            <solid android:color="#400000ff"/>
        </shape>
    </item>
    <item android:state_checkable="true">
        <shape android:shape="rectangle">
            <solid android:color="#400000ff"/>
        </shape>
    </item>
    <item android:state_checked="true">
        <shape android:shape="rectangle">
            <solid android:color="#800000ff"/>
        </shape>
    </item>
</selector>

和 CheckableLinearLayout.java:

package com.fletech.smartbaby.api;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
//import android.support.v7.widget.LinearLayoutCompat; // do I need this? I can't see any difference
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Checkable;
import android.widget.LinearLayout;

public class CheckableLinearLayout extends LinearLayout implements Checkable {
    private static final String TAG = CheckableLinearLayout.class.getSimpleName();
    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};

    private boolean mChecked;

    public CheckableLinearLayout(Context context) {
        super(context);
    }

    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setChecked(boolean checked) {
        Log.v(TAG, "setChecked: " + checked);
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
        }
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void toggle() {
        Log.v(TAG, "toggle: " + mChecked + " -> " + (!mChecked));
        setChecked(!mChecked);
    }

    @Override
    // not sure if needed, as it seems to work without this as well
    public boolean performClick() {
        Log.v(TAG, "performClick");
        toggle();
        return super.performClick();
    }

    @Override
    // this might be unnecessary
    protected void drawableStateChanged() {
        Log.v(TAG, "drawableStateChanged");
        super.drawableStateChanged();
        final Drawable drawable=getBackground();
        if(drawable!=null)
        {
            final int[] myDrawableState=getDrawableState();
            drawable.setState(myDrawableState);
            invalidate();
        }
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        Log.v(TAG, "onCreateDrawableState: " + extraSpace);
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }

        return drawableState;
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        SavedState result = new SavedState(super.onSaveInstanceState());
        result.checked = mChecked;
        return result;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        if (!(state instanceof SavedState)) {
            super.onRestoreInstanceState(state);
            return;
        }

        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());

        setChecked(ss.checked);
    }

    protected static class SavedState extends BaseSavedState {
        protected boolean checked;

        protected SavedState(Parcelable superState) {
            super(superState);
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(checked ? 1 : 0);
        }

        public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };

        private SavedState(Parcel in) {
            super(in);
            checked = in.readInt() == 1;
        }
    }
}
回答1

我花了一个多星期才弄明白为什么这个对每个人都有效的东西对我不起作用。 答案很简单。 我希望它会帮助别人。

解决方案是更改选择器 xml 中项目的顺序。 没有任何状态的项目必须是最后一个:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_long_pressable="true">
        <shape android:shape="rectangle">
            <solid android:color="#400000ff"/>
        </shape>
    </item>
    <item android:state_checkable="true">
        <shape android:shape="rectangle">
            <solid android:color="#400000ff"/>
        </shape>
    </item>
    <item android:state_checked="true">
        <shape android:shape="rectangle">
            <solid android:color="#800000ff"/>
        </shape>
    </item>

    <!-- the item without any states has to be the last: -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#40777777"/>
        </shape>
    </item>
</selector>

原因是解析器似乎在 xml 文件中查找匹配的第 1 项。 这意味着,如果您有具有不同状态数量的项目,那么您应该始终在 xml 顶部定义具有更多状态的项目。 例如:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checkable="true" android:state_long_pressable="true">
        <shape android:shape="rectangle">
            <solid android:color="#ffff00"/>
        </shape>
    </item>
    <item android:state_long_pressable="true">
        <shape android:shape="rectangle">
            <solid android:color="#ff0000"/>
        </shape>
    </item>
    <item android:state_checkable="true">
        <shape android:shape="rectangle">
            <solid android:color="#00ff00"/>
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#40777777"/>
        </shape>
    </item>
</selector>

这样,只有这样,您才会在以下项目上看到不同的颜色: - 可检查和 long_pressable - 可检查,但不是 long_pressable - long_pressable 但不可检查 - 其他所有内容

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Android listselector在自定义listview中不可见(Android listselector not visible in custom listview)
    问题 我做了一个具有图像和textview的自定义列表。 设置样式时,选择器不可见。 使用setTheme(R.style.rose);调用样式。 在Listactivity的create方法中作为第一个调用。 但是,如果没有颜色用作背景(或样式中的背景线带有注释),则橙色选择器可见。 但是当背景是 listSelector <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" /> <item android:state_pressed="true" android:drawable="@drawable/list_selector_background_pressed" /> <item android:state_focused="true" android:drawable="@drawable/list_selector_background_focus" /> 风格 <style name="rose"> <item name="android:textColor">@color/pink</item> <item name="android:background">
  • 如何使 EntranceThemeTransition 在自定义面板和 ItemsSource 上工作?(How to make EntranceThemeTransition works on a Custom Panel & ItemsSource?)
    问题 我无法让 EntranceThemeTransition 在自定义面板上作为 ItemsPanelTemplate 工作。 看: 背后最简单的代码: public List<int> MyListExample = new List<int>() {0, 1, 2, 3, 4, 5}; 最简单的 XAML: <ListView Width="120" ItemsSource="{x:Bind MyListExample}"> <ListView.ItemContainerTransitions> <TransitionCollection> <EntranceThemeTransition FromVerticalOffset="200" IsStaggeringEnabled="True"/> </TransitionCollection> </ListView.ItemContainerTransitions> <ListView.ItemsPanel> <ItemsPanelTemplate> <!--EntranceThemeTransition WORKS--> <ItemsWrapGrid/> <!--EntranceThemeTransition does NOT work--> <!--<StackPanel/>--> <!-
  • 更改ListView上所选项目的背景颜色(Change background color of selected item on a ListView)
    问题 我想知道如何更改listView上所选项目的背景颜色。 我只想更改用户单击的特定项目,这意味着如果用户单击另一个项目,它将被突出显示。 好吧,因为我希望它尽可能保持简单并使用默认的android listview,所以我改用以下代码: record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try{ for (int ctr=0;ctr<=record_items.length;ctr++){ if(i==ctr){ record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN); }else{ record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE); } } } catch (Exception e){ e.printStackTrace(); } Log.v("Selected item",record_list.getItemAtPosition(i)); } }); 好的,这是可行的
  • 如何制作自定义ListView(How to make custom ListView)
    问题 我有一个 TextView,里面有一个列表。 public class Home extends ListActivity { ListView listView; static final String[] Liste = {"a", "b", "c"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("CalcPlus"); listView = getListView(); //Own row layout listView.setAdapter(new ArrayAdapter<String>(this, R.layout.activity_home, R.id.text, Liste)); //listView.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_home, menu); return true; } 现在我想要列表项的灰色小说明,如下所示: 我阅读了这些教程:1 和 2
  • ActionBar 上的 SearchView:如何使用自定义适配器在自定义 Listview 上执行 SQLite 搜索?(SearchView on ActionBar: How to perform SQLite search on a custom Listview with custom adapter?)
    问题 我有一个带有多个EditText的自定义ListView ,并且我想使搜索功能仅与其中一个EditText一起工作。 到目前为止,我已经能够在ActionBar上实现SearchView ,但我不知道如何使用 onQueryTextChange/Submit 方法在我的 SQLite 数据库中进行搜索。 我查看了 youtube 和 google 的所有内容,但找不到任何对使用自定义列表视图有明确帮助的内容。 在没有SQLite数据的简单列表视图上,我能够找到一些不错的示例,但是我不确定如何使它们适应我的情况……我真的需要帮助! 如果您需要任何其他信息,请随时询问,我会立即发布。 非常感谢你! 代码 我的 customAdapter 视图 public View getView(int position, View view, ViewGroup parent) { Cliente cliente = lista.get(position); if(view == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.single_row
  • 在自定义列表视图中一次只选择一个单选按钮,android(Select only one radio button at a time in custom list view, android)
    问题 我正在尝试制作自定义列表视图。 列表视图中的每个条目都有一个图像视图、一个文本视图和一个单选按钮。 我终于列出了清单,但现在我在选择单选按钮时遇到了问题。 我想要的是每当用户单击条目中的任意位置时,这应该设置相应的单选按钮并自动取消选择列表中的其他单选按钮。 这是我的代码:bus_item.xml :- <?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="horizontal" > <ImageView android:id="@+id/imglist_icon" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center_vertical" android:layout_margin="10dp" android:src="@drawable/alaknanda" /> <TextView android
  • 突出显示ListView选定的行(Highlight ListView selected row)
    问题 我有一张专辑清单(几百张)。 当我触摸选定的专辑时,我想为用户提供播放整个专辑或移动到其曲目ListView的选择。 没问题。 但是,在触摸albumListView中的空白之后,我希望该行保持突出显示,以便用户知道他们单击了哪个项目,然后可以移至“确定”或“播放”。 如何在ListView中突出显示一行? 回答1 引用自http://android-developers.blogspot.de/2008/12/touch-mode.html 想象一个简单的应用程序,例如ApiDemos,它显示了一个文本项列表。 用户可以使用轨迹球自由浏览列表,也可以使用触摸屏滚动和弹出列表。 这种情况下的问题是,当用户通过触摸屏操作列表时,如何正确处理选择。 在这种情况下,如果用户在列表顶部选择一个项目,然后将列表向底部倾斜,那么选择该怎么办? 它应该保留在项目上并滚动到屏幕之外吗? 如果用户随后决定使用轨迹球移动选择内容,应该怎么办? 或更糟糕的是,如果用户按下轨迹球以对当前选定的项目进行操作,该项目将不再显示在屏幕上,该怎么办? 经过仔细考虑,我们决定在用户​​通过触摸屏操纵UI时完全删除选择。 在触摸模式下,没有焦点,也没有选择。 用户进入触摸模式后,网格列表中的任何选定项目都会被取消选择。 同样,当用户进入触摸模式时,所有聚焦的窗口小部件都将变为非聚焦状态。
  • 使用CAB在自定义ListView中进行多项选择(Multiple selection in custom ListView with CAB)
    问题 在阅读并尝试了好几天的错误之后,我正在放弃并寻求帮助。 <编辑>我正在使用ActionBarSherlock。 </编辑> 我要实现的目标:一个ListView,每行具有自定义布局,用户可以在其中选择多个列表项。 所选列表项应具有不同的背景色。 如果选择了至少一项,则应显示上下文操作栏(CAB)。 它看起来或多或少类似于GMail应用程序中对电子邮件的多种选择。 唯一的区别是,在gmail应用程序中,选择是通过单击一行的复选框来完成的,而我不想有一个复选框,但是无论用户单击何处,都应选择一行。 我尝试的方法:在本教程中,使用Checkable行布局和一些逻辑来更改切换检查状态时的背景色,除了无法在ListView上注册类似于OnItemClickListener的单击侦听器以显示CAB之外,其他所有工作。 为每行视图提供单击侦听器都没有帮助,因为这阻止了更改所选项目的背景颜色。 我也尝试像这样将MultiChoiceModeListener添加到ListView listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { //.. }); 结果相同,背景颜色不变。 我在寻找什么
  • 设置背景图像,如果自定义列表视图项被按下(Set Background image, if the Custom Listview item is pressed)
    问题 我正在使用基本适配器使用自定义列表视图 <ListView android:id="@+id/lstHome" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:drawSelectorOnTop="false" android:cacheColorHint="#3d4241" android:clickable="true" android:listSelector="@drawable/listbackground"> </ListView> 和 listbackground.xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/transparent" android:state_pressed="false" android:state_selected="false"/> <item android:drawable="@drawable
  • 按下项目后的 ListSelector 颜色(ListSelector Color after pressed an Item)
    问题 我阅读了很多关于 ListSelector 和选择器的内容。 但是我无法弄清楚如何在按下后让 ListView 的项目具有不同的颜色。 在双片段布局中,用户在左侧 ListView 中单击,数据被加载并显示在右侧片段中。 为了让用户知道选择了哪个项目,我希望突出显示该项目,直到按下 Left ListView 中的下一个项目。 我需要一个自定义状态吗? GMail 应用程序如何做到这一点? 谢谢 回答1 对,你需要额外的状态。 我不确定 GMail 应用程序是如何做到的,但默认的 android 设置在平板电脑列表的选择器中使用android:state_activated="true"状态。 不要忘记设置列表android:choiceMode="singleChoice" 。 回答2 你试过这个选择器吗? <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_window_focused="false" android:state_selected="true" android:drawable="@android:color/transparent" /> <item android:state_selected="true" android
  • 如何在自定义列表视图中对项目单击启动不同的活动?(How can i start a different activity on item click from a custom listview?)
    问题 我遵循了许多教程,例如http://www.javacodegeeks.com/2013/09/android-listview-with-adapter-example.html。此外,我还遵循了此处提出的问题,如何在单击列表项时如何创建自定义ListView来打开其他活动? 但是,在这里尝试答案(如何单击列表项时如何使自定义ListView打开其他活动?)后,无论何时我从列表视图中选择一个项目,我的应用程序都会停止运行。 我的主要活动代码: public class MainActivity extends Activity { ListView list; String[] web = { "Notifications", "School", "What's Hot", "Tell a friend", "Hit us up", "Settings", "About & Help" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomList adapter = new CustomList(MainActivity.this
  • 通过自定义选择器的ListView项目背景(ListView item background via custom selector)
    问题 是否可以通过列表选择器将自定义背景应用于每个Listview项目? 默认选择器为state_focused="false"情况指定@android:color/transparent ,但将其更改为某些自定义可绘制对象不会影响未选中的项目。 罗曼·盖伊(Romain Guy)似乎在此答案中暗示这是可能的。 我目前正在通过在每个视图上使用自定义背景并在选择/聚焦/以任何方式显示选择器时将其隐藏来实现相同的效果,但是将所有这些都定义在一个位置会更加优雅。 作为参考,这是我用来尝试使其工作的选择器: <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
  • 如何在iOS8自定义键盘中制作类似键盘字符的弹出窗口?(How to make popup like keyboard characters in iOS8 custom keyboard?)
    问题 我想在iOS8自定义键盘中创建弹出窗口,如下图所示。 某些代码可以正常工作,但无法访问键盘的外部窗口,并出现如下图2所示的问题 回答1 这是我在自定义键盘中所做的工作 //adding pop up when character is tapped - (void)addPopupToButton:(UIButton *)button { CGRect frame,frame1; if(self.view.frame.size.width == 320) { //Keyboard is in Portrait frame = CGRectMake(0, -25, 28, 43); frame1=CGRectMake(0, 0, 28, 43); } else{ //Keyboard is in Landscape frame = CGRectMake(3, -25, 35, 43); frame1=CGRectMake(0, 10, 35, 43); } //create pop up view UIView *popUp=[[UIView alloc]initWithFrame:frame]; //create a label to add to pop up view UILabel *text = [[UILabel alloc] init]; //set frame
  • 如何在自定义 Xamarin.Forms ViewCell 上的行之间添加分隔符空间?(How to add a separator space between rows on custom Xamarin.Forms ViewCell?)
    问题 在 Xamarin 论坛上的这个问题 https://forums.xamarin.com/discussion/20517/curved-corners-in-tableview-cells Craig Dunn 教授了如何创建带有框架的单元格。 我想在每个单元格之间添加一个空格。 目前这些单元格似乎是粘在一起的,而ViewCell没有空间属性。 谢谢! 回答1 您只需要进一步自定义MenuCell的布局即可实现此目的。 下面显示的是一个版本,它使用进一步的Xamarin.Forms.Frame在每个项目之间创建间距,并进行其他一些修改:- XAML 页面:- <ListView x:Name="lstItems" /> XAML 代码隐藏:- lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell)); lstItems.ItemsSource = new string[] { "Apples", "Bananas", "Pears", "Oranges" }; ViewCell 类:- public class MenuCell : ViewCell { public MenuCell() { Label objLabel = new Label { YAlign = TextAlignment
  • 我应该将 onClickListener 放在自定义 ListView 上的什么位置?(Where should I place the onClickListener on a Custom ListView?)
    问题 我正在制作包含CheckBox和TextView的行的自定义ListView 。 在我使用带有 SimpleCursorAdapter 的自定义ListViews之前,我的onListItemClick()工作正常。 我读过我必须在我的TextViews添加一个onClickListener但在哪里? 为什么? 我仍在扩展ListActivity并将Adapter传递给setListAdapter(listedPuzzleAdapter); ,我不是吗? public class PuzzleListActivity extends ListActivity { private PuzzlesDbAdapter mDbHelper; private Cursor puzzlesCursor; private ArrayList<ListedPuzzle> listedPuzzles = null; private ListedPuzzleAdapter listedPuzzleAdapter; private class ListedPuzzleAdapter extends ArrayAdapter<ListedPuzzle> { private ArrayList<ListedPuzzle> items; public ListedPuzzleAdapter
  • 自定义适配器,所选项目背景(Custom adapter, selected item background)
    问题 我在自定义适配器视图上遇到问题。 我尝试更改Click事件的view背景。 我有AdapterView.OnItemClickListener ,在这里我可以选择项目并调用myListView.invalidate(); 无效后,调用adapters getView(...) 。 这里的代码: @Override public View getView(int position,View convertView,ViewGroup parent){ View row = convertView; ProjectAdapterData projectItem; if (row == null) { LayoutInflater inflater = LayoutInflater.from(context); row = inflater.inflate(R.layout.project_small_item_layout, null); ProjectAdapterData projectAdapterData = new ProjectAdapterData(); row.setTag(projectAdapterData); name = (TextView)row.findViewById(R.id.txtObjectName); if (objectData
  • 如何在自定义对象的android中使用ArrayAdapter(how to use an ArrayAdapter in android of custom objects)
    问题 如何在Listview中使用自定义对象的属性。 如果我实现一个带有字符串列表的ArrayAdapter,它在Listview中会很好地显示,但是当我使用自定义对象的列表时,它只会输出内存地址。 我到目前为止的代码: ArrayList<CustomObject> allObjects = new ArrayList<>(); allObjects.add("title", "http://url.com")); ArrayAdapter<NewsObject> adapter = new ArrayAdapter<NewsObject>(this, android.R.layout.simple_list_item_1, android.R.id.text1, allNews); // Assign adapter to ListView listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Uri uri = Uri.parse( "http
  • setOnItemClickListener()在自定义ListView @ Android上不起作用(setOnItemClickListener() not working on custom ListView @ Android)
    问题 我通过扩展每行的LinearLayout实现了自定义ListView 。 每行都有一个小缩略图,一个文本和一个check box 。 list view已正确部署,我可以滚动浏览它而没有任何问题。 但是ListView似乎根本不响应setOnItemClickListener() ,因此我不得不通过在每一行内的Text的getView()中设置单击侦听器来找到一种解决方法,这在尝试重用时显然会造成问题adapter 。 有没有人有办法解决吗? 回答1 尝试这个对于ListView, final ListView list = (ListView) findViewById(R.id.list); list.setItemsCanFocus(false); 另外,请确保对于CheckBox列表项内的set focusable false android:focusable="false" android:focusableInTouchMode="false" 回答2 旧答案:我在以前的帖子中写过 android:focusable="false" android:clickable="false" 在自定义视图中使用ImageButton时将无济于事。必须使用button.setFocusable(false); 在运行时(来自Java源代码) 编辑:还有更优雅的解决方案。
  • 使用 ArrayAdapter 在自定义列表视图中滚动时微调器重置值(Spinner reset value when scrolling in a custom listview with ArrayAdapter)
    问题 我是 android 的初学者......我需要你的帮助。 在我的应用程序中,我使用自定义适配器和自定义行布局创建了一个列表视图。 我这样做很成功,我在所有行中添加了一个图像、文本视图和一个微调下拉菜单。 在下拉列表中有项目数(例如从 0 到 9) 但我的问题是,当我选择下拉列表并设置一些值时,在滚动列表时,微调器将自身重置为初始值(此处为 0)。我正在为微调器使用值 0 到 9 的字符串。 我能做些什么来避免这个问题? 任何帮助将不胜感激......提前致谢。 //This is my custom adapter code.... public class MyProductsArrayAdapter extends ArrayAdapter<Products> { Context context; int resourceId; Products data[] = null; public MyProductsArrayAdapter(Context context, int resourceId, Products data[]) { super(context, resourceId, data); this.context = context; this.resourceId = resourceId; this.data = data; } static
  • 在Android上更改ListView项的背景颜色(Changing background color of ListView items on Android)
    问题 如何按项目更改ListView项目的背景颜色。 当我在ListView项目布局中使用android:backgroundColor ,可以实现此目的,但是列表选择器不再可见。 我可以通过将drawSelectorOnTop设置为true来使选择器再次可见,但是选择器会覆盖整个项目。 有什么想法可以更改这些背景颜色并保留选择器吗? PS我宁愿不更改选择器本身。 编辑:GMail应用程序的作者已经设法实现了这一目标,因此这绝对是可能的。 回答1 您必须为要使用的每种颜色创建一个不同的状态可绘制对象。 例如: list_selector_read.xml和list_selector_unread.xml 。 您需要做的就是将除android:state_window_focused="false"项目之外的所有内容都设置为透明。 然后,在绘制列表时,请为每一行调用setBackgroundResource(R.drawable.list_selector_unread/read) 。 您根本不需要在ListView上设置listSelector。 这将保留您特定的Android风格的默认选择器。 回答2 这是基于以上代码(最简单的代码)的修改: private static int save = -1; public void onListItemClick(ListView