如何实现最喜欢的按钮,我BaseAdapter的ListView? [英] How to implement Favorite Button to my BaseAdapter ListView?

查看:182
本文介绍了如何实现最喜欢的按钮,我BaseAdapter的ListView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我学习Android SDK和我需要一些建议。结果
我有BaseAdapter定制的ListView和我要实现一些新的功能 - 收藏按钮。

我想要做的是,当我preSS收藏夹按钮,列表项进入到列表中,最喜欢的图像变化和所有的东西一开始会被保存在共享preFS。

有人告诉我,我需要做的,做它的工作原理?

我现有的code:

row.xml:

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
              机器人:layout_width =FILL_PARENT
              机器人:layout_height =WRAP_CONTENT
                机器人:ID =@ + ID / layout_element_list
    >    < ImageView的
        机器人:ID =@ + ID /图标
        机器人:layout_width =150dp
        机器人:填充=5DP
        机器人:layout_height =150dp
        机器人:layout_marginLeft =递四方
        机器人:layout_marginRight =10px的
        机器人:layout_marginTop =递四方
        机器人:SRC =@绘制/收音机>
    < / ImageView的>
    <的LinearLayout
        机器人:方向=垂直
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>
        <的TextView
            机器人:ID =@ + /标记
            机器人:paddingTop =20dp
            机器人:layout_gravity =center_vertical
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =FILL_PARENT
            机器人:layout_weight =1
            机器人:textAlignment =中心
            机器人:文字=RadioName
            机器人:文字颜色=@颜色/颜色1
            机器人:TEXTSIZE =30dp/>
        <的LinearLayout
            机器人:方向=横向
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =FILL_PARENT
            机器人:layout_weight =1>
            <的TextView
                机器人:ID =@ + ID / LABEL2
                机器人:layout_gravity =center_vertical
                机器人:layout_width =FILL_PARENT
                机器人:layout_weight =1
                机器人:layout_height =FILL_PARENT
                机器人:textAlignment =中心
                机器人:文字=说明..
                机器人:文字颜色=@颜色/颜色1
                机器人:TEXTSIZE =15dp/>
            < ImageView的
                机器人:ID =@ + ID / favButton
                机器人:layout_weight =1
                机器人:layout_width =FILL_PARENT
                机器人:填充=5DP
                机器人:layout_height =FILL_PARENT
                机器人:layout_marginLeft =递四方
                机器人:layout_marginRight =10px的
                机器人:layout_marginTop =递四方
                机器人:SRC =@绘制/ fav_off>
            < / ImageView的>
        < / LinearLayout中>
    < / LinearLayout中>
< / LinearLayout中>

BaseAdapter类:

 公共类RadioAdapter延伸BaseAdapter
{    ArrayList的<无线站> myList中=新的ArrayList<无线站>();
    LayoutInflater吹气;
    上下文语境;    公共RadioAdapter(上下文的背景下,ArrayList的<无线站> myList中){
        this.myList = myList中;
        this.context =背景;
        吹气= LayoutInflater.from(this.context);
    }    @覆盖
    公众诠释的getCount(){
        返回myList.size();
    }    @覆盖
    公共无线站的getItem(INT位置){
        返回myList.get(位置);
    }    @覆盖
    众长getItemId(INT位置){
        返回0;
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        MyViewHolder mViewHolder;        如果(convertView == NULL){
            convertView = inflater.inflate(R.layout.activity_menu_row,NULL);
            mViewHolder =新MyViewHolder();
            convertView.setTag(mViewHolder);
        }其他{
            mViewHolder =(MyViewHolder)convertView.getTag();
        }        mViewHolder.tvTitle =细节(convertView,R.id.label,myList.get(位置).getTitle());
        mViewHolder.tvDesc =细节(convertView,R.id.label2,myList.get(位置).getDescription());
        mViewHolder.ivIcon =细节(convertView,R.id.icon,myList.get(位置).getImgResId());        返回convertView;
    }    私人TextView的细节(视图V,INT渣油,字符串文本){
        TextView的电视=(TextView中)v.findViewById(渣油);
        tv.setText(文本);
        返回电视;
    }    私人ImageView的细节(视图V,INT渣油,诠释图标){
        ImageView的IV =(ImageView的)v.findViewById(渣油);
        iv.setImageResource(图标); //
        返回IV;
    }    私有类MyViewHolder {
        TextView的tvTitle,tvDesc;
        ImageView的ivIcon;
    }
}

无线站类:

 公共类无线站
{
    公共字符串称号;
    公共字符串描述;
    公众诠释imgResId;    // getter和setter    公共静态比较<无线站> comparatorByRadioName =新的比较<无线站>()
    {
        @覆盖
        公众诠释比较(无线站无线站,无线站radioStation2)
        {
            。字符串名称1 = radioStation.getTitle()与toLowerCase();
            。字符串名称2 = radioStation2.getTitle()与toLowerCase();
            返回name1.compareTo(名2);
        }
    };
}

ActivityListView:

 公共类ActivityMenuList扩展活动实现AdapterView.OnItemClickListener
{
    私人的ListView lvDetail;
    私人上下文的背景下= ActivityMenuList.this;
    私人的ArrayList<无线站> myList中=新的ArrayList<无线站>();
    私有String [] =名新的String [] {一,二,三化};
    私有String [] =说明新的String [] {notset,notset,notset};
    私人诠释[] =影像新INT [] {R.drawable.one,R.drawable.two,R.drawable.three};    公共无效的onCreate(捆绑冰柱){
        super.onCreate(冰柱);
        。getWindow()setBackgroundDrawableResource(R.drawable.bg1);
        的setContentView(R.layout.activity_menu_list);
        lvDetail =(ListView控件)findViewById(R.id.list);
        lvDetail.setOnItemClickListener(本);
        getDataInList();
        lvDetail.setAdapter(新RadioAdapter(上下文,myList中));
    }
    私人无效getDataInList(){
        的for(int i = 0;我3;;我++){
            无线站LD =新的无线站();
            ld.setTitle(名称[I]);
            ld.setDescription(描述[I]);
            ld.setImgResId(图片由[i]);
            myList.add(LD);
        }
        Collections.sort(myList上,RadioStation.comparatorByRadioName);
    }    @覆盖
    公共无效onItemClick(适配器视图<>适配器视图,视图观点,INT I,长L)
    {
        字符串项=名称[I]
        意图E =新意图(ActivityMenuList.this,ActivityRadioStation.class);
        捆绑数据=新包();
        data.putString(无线站项目);
        e.putExtras(数据);
        startActivity(E);
    }
}


解决方案

这是很多你必须做的改变。让我们先从基本的。
一个布尔值添加到您的无线站为最喜欢的状态。

 公共布尔isFavorite;

接下来您getView加入收藏夹按钮点击监听器(添加其参考viewholder太多,但让我们保持简单的这段时间)

 公共类RadioAdapter延伸BaseAdapter
{
    ArrayList的<无线站> myList中=新的ArrayList<无线站>();
    LayoutInflater吹气;
    上下文语境;
    ListView的mListview;    公共RadioAdapter(上下文的背景下,ArrayList的<无线站> myList上,ListView控件列表){
        this.myList = myList中;
        this.context =背景;
        mListView =清单;
        吹气= LayoutInflater.from(this.context);
    }    @覆盖
    公众诠释的getCount(){
        返回myList.size();
    }    @覆盖
    公共无线站的getItem(INT位置){
        返回myList.get(位置);
    }    @覆盖
    众长getItemId(INT位置){
        返回0;
    }    @覆盖
    公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
        MyViewHolder mViewHolder;        如果(convertView == NULL){
            convertView = inflater.inflate(R.layout.activity_menu_row,NULL);
            mViewHolder =新MyViewHolder();
            convertView.setTag(mViewHolder);
        }其他{
            mViewHolder =(MyViewHolder)convertView.getTag();
        }        mViewHolder.tvTitle =细节(convertView,R.id.label,myList.get(位置).getTitle());
        mViewHolder.tvDesc =细节(convertView,R.id.label2,myList.get(位置).getDescription());
        mViewHolder.ivIcon =细节(convertView,R.id.icon,myList.get(位置).getImgResId());
        convertView.findViewById(R.id.favButton).setOnClickListener(新View.OnClickListener()
        {
            @覆盖
            公共无效的onClick(查看视图)
            {
                myList.get(位置).isFavorite =! myList.get(位置).isFavorite;
                //重新排序mlist
                notifyDataSetChanged();
                // mListView。 smoothscroll这里
            }
        });        ((ImageView的) convertView.findViewById(R.id.favButton)).setImageResource(myList.get(position).isFavorite?R.drawable.favoriteOn:R.drawable.favoriteOff);
        返回convertView;
    }    私人TextView的细节(视图V,INT渣油,字符串文本){
        TextView的电视=(TextView中)v.findViewById(渣油);
        tv.setText(文本);
        返回电视;
    }    私人ImageView的细节(视图V,INT渣油,诠释图标){
        ImageView的IV =(ImageView的)v.findViewById(渣油);
        iv.setImageResource(图标); //
        返回IV;
    }    私有类MyViewHolder {
        TextView的tvTitle,tvDesc;
        ImageView的ivIcon;
    }
}

我离开你的评论应该在听者做什么。您应该能够从这里继续。

当您创建适配器通过列表作为构造函数的最后一个参数。

编辑:删除接口。没有必要在这里使用它。

I'm learning Android SDK and I need some advices.
I have custom ListView with BaseAdapter and I want to implement some new feature - Favorite Button.

What I want to do is, when I press the Favorite Button, ListItem goes to the beginning of the list, Favorite image change and all that stuff will be saved in the SharedPrefs.

Someone tell me what I need to do, to make it works?

my existing code:

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 class:

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 class:

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

解决方案

That's a lot of changes you have to do. Let's start with the basic. Add a boolean to your RadioStation for the favorite state.

public boolean isFavorite;

Next on your getView add the favorite button click listener(add its reference to the viewholder too, but let's keep it simple this time)

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

I left commented what you should do on the listener. You should be able to continue from here.

When you create your adapter pass the list as the last parameter on the constructor.

Edited: Removed interface. No need to use it here.

这篇关于如何实现最喜欢的按钮,我BaseAdapter的ListView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆