【问题标题】:How to implement Favorite Button to my BaseAdapter ListView?如何在我的 BaseAdapter ListView 中实现收藏按钮?
【发布时间】:2014-09-09 13:48:11
【问题描述】:

我正在学习 Android SDK,我需要一些建议。
我有带有 BaseAdapter 的自定义 ListView,我想实现一些新功能 - 收藏按钮。

我想要做的是,当我按下收藏按钮时,ListItem 会转到列表的开头,收藏的图像会发生变化,所有这些内容都将保存在 SharedPrefs 中。

有人告诉我我需要做什么才能让它发挥作用吗?

我现有的代码:

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:layout_height="wrap_content"
                android:id="@+id/layout_element_list"
    >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="150dp"
        android:padding="5dp"
        android:layout_height="150dp"
        android:layout_marginLeft="4px"
        android:layout_marginRight="10px"
        android:layout_marginTop="4px"
        android:src="@drawable/radio" >
    </ImageView>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:id="@+id/label"
            android:paddingTop="20dp"
            android:layout_gravity="center_vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:textAlignment="center"
            android:text="RadioName"
            android:textColor="@color/color1"
            android:textSize="30dp" />
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1">
            <TextView
                android:id="@+id/label2"
                android:layout_gravity="center_vertical"
                android:layout_width="fill_parent"
                android:layout_weight="1"
                android:layout_height="fill_parent"
                android:textAlignment="center"
                android:text="Description.."
                android:textColor="@color/color1"
                android:textSize="15dp" />
            <ImageView
                android:id="@+id/favButton"
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:padding="5dp"
                android:layout_height="fill_parent"
                android:layout_marginLeft="4px"
                android:layout_marginRight="10px"
                android:layout_marginTop="4px"
                android:src="@drawable/fav_off" >
            </ImageView>
        </LinearLayout>
    </LinearLayout>
</LinearLayout> 

BaseAdapter 类:

public class RadioAdapter extends BaseAdapter
{

    ArrayList<RadioStation> myList = new ArrayList<RadioStation>();
    LayoutInflater inflater;
    Context context;

    public RadioAdapter(Context context, ArrayList<RadioStation> myList) {
        this.myList = myList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);
    }

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

    @Override
    public RadioStation getItem(int position) {
        return myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyViewHolder mViewHolder;

        if(convertView == null) {
            convertView = inflater.inflate(R.layout.activity_menu_row, null);
            mViewHolder = new MyViewHolder();
            convertView.setTag(mViewHolder);
        } else {
            mViewHolder = (MyViewHolder) convertView.getTag();
        }

        mViewHolder.tvTitle = detail(convertView, R.id.label, myList.get(position).getTitle());
        mViewHolder.tvDesc  = detail(convertView, R.id.label2,  myList.get(position).getDescription());
        mViewHolder.ivIcon  = detail(convertView, R.id.icon,  myList.get(position).getImgResId());

        return convertView;
    }

    private TextView detail(View v, int resId, String text) {
        TextView tv = (TextView) v.findViewById(resId);
        tv.setText(text);
        return tv;
    }

    private ImageView detail(View v, int resId, int icon) {
        ImageView iv = (ImageView) v.findViewById(resId);
        iv.setImageResource(icon); //
        return iv;
    }

    private class MyViewHolder {
        TextView tvTitle, tvDesc;
        ImageView ivIcon;
    }
}

RadioStation 类:

public class RadioStation
{
    public String title;
    public String description;
    public int imgResId;

    //getters and setters  

    public static Comparator<RadioStation> comparatorByRadioName = new Comparator<RadioStation>()
    {
        @Override
        public int compare(RadioStation radioStation, RadioStation radioStation2)
        {
            String name1 = radioStation.getTitle().toLowerCase();
            String name2 = radioStation2.getTitle().toLowerCase();
            return name1.compareTo(name2);
        }
    };
}

ActivityListView:

public class ActivityMenuList extends Activity implements AdapterView.OnItemClickListener
{
    private ListView lvDetail;
    private Context context = ActivityMenuList.this;
    private ArrayList <RadioStation> myList = new ArrayList <RadioStation>();
    private String[] names = new String[] { "one", "two", "three" };
    private String[] descriptions = new String[] { "notset", "notset", "notset"};
    private int[] images = new int[] { R.drawable.one, R.drawable.two, R.drawable.three };

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getWindow().setBackgroundDrawableResource(R.drawable.bg1);
        setContentView(R.layout.activity_menu_list);
        lvDetail = (ListView) findViewById(R.id.list);
        lvDetail.setOnItemClickListener(this);
        getDataInList();
        lvDetail.setAdapter(new RadioAdapter(context, myList));
    }
    private void getDataInList() {
        for(int i=0;i<3;i++) {
            RadioStation ld = new RadioStation();
            ld.setTitle(names[i]);
            ld.setDescription(descriptions[i]);
            ld.setImgResId(images[i]);
            myList.add(ld);
        }
        Collections.sort(myList, RadioStation.comparatorByRadioName);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
    {
        String item = names[i];
        Intent e = new Intent(ActivityMenuList.this, ActivityRadioStation.class);
        Bundle data = new Bundle();
        data.putString("radiostation",item);
        e.putExtras(data);
        startActivity(e);
    }
}

【问题讨论】:

    标签: java android android-layout android-listview baseadapter


    【解决方案1】:

    这是你必须做的很多改变。让我们从基础开始。 为您的 RadioStation 添加一个布尔值以获得最喜欢的状态。

    public boolean isFavorite;
    

    接下来在您的 getView 上添加最喜欢的按钮单击侦听器(也将其引用添加到 viewholder,但这次让我们保持简单)

    public class RadioAdapter extends BaseAdapter
    {
        ArrayList<RadioStation> myList = new ArrayList<RadioStation>();
        LayoutInflater inflater;
        Context context;
        ListView mListview;
    
        public RadioAdapter(Context context, ArrayList<RadioStation> myList, ListView list) {
            this.myList = myList;
            this.context = context;
            mListView = list;
            inflater = LayoutInflater.from(this.context);
        }
    
        @Override
        public int getCount() {
            return myList.size();
        }
    
        @Override
        public RadioStation getItem(int position) {
            return myList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            MyViewHolder mViewHolder;
    
            if(convertView == null) {
                convertView = inflater.inflate(R.layout.activity_menu_row, null);
                mViewHolder = new MyViewHolder();
                convertView.setTag(mViewHolder);
            } else {
                mViewHolder = (MyViewHolder) convertView.getTag();
            }
    
            mViewHolder.tvTitle = detail(convertView, R.id.label, myList.get(position).getTitle());
            mViewHolder.tvDesc  = detail(convertView, R.id.label2,  myList.get(position).getDescription());
            mViewHolder.ivIcon  = detail(convertView, R.id.icon,  myList.get(position).getImgResId());
            convertView.findViewById(R.id.favButton).setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                    myList.get(position).isFavorite=! myList.get(position).isFavorite;
                    //reorder mlist
                    notifyDataSetChanged();
                    //mListView. smoothscroll here
                }
            });
    
            ((ImageView) convertView.findViewById(R.id.favButton)).setImageResource(myList.get(position).isFavorite?R.drawable.favoriteOn:R.drawable.favoriteOff);
            return convertView;
        }
    
        private TextView detail(View v, int resId, String text) {
            TextView tv = (TextView) v.findViewById(resId);
            tv.setText(text);
            return tv;
        }
    
        private ImageView detail(View v, int resId, int icon) {
            ImageView iv = (ImageView) v.findViewById(resId);
            iv.setImageResource(icon); //
            return iv;
        }
    
        private class MyViewHolder {
            TextView tvTitle, tvDesc;
            ImageView ivIcon;
        }
    }
    

    我留下评论你应该对听众做什么。您应该可以从这里继续。

    创建适配器时,将列表作为构造函数的最后一个参数传递。

    编辑:删除界面。此处无需使用。

    【讨论】:

    • 它有效-谢谢。可以用implement View.OnClickListener 代替new OnClickListener
    • 我不明白你的意思。你能解释得更好吗?
    • 总是当我想使用 OnClickLister 时,我总是在我的 Activity 类中实现 View.OnClickLister 并生成 Override 方法调用 onClick()。这种情况下可以用吗?
    • 没有必要。您将如何区分不同视图的不同点击?我没有看到这样做的意义,在这种情况下我不推荐给你。
    • 我创建了新的 Comparator 和 SharedPrefs,一切正常,就像我想要的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多