Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新列表视图中的按钮_Java_Android_Android Listview - Fatal编程技术网

Java 更新列表视图中的按钮

Java 更新列表视图中的按钮,java,android,android-listview,Java,Android,Android Listview,我想更新列表视图中的按钮。我目前拥有的代码工作正常,但有一个小故障,当到达最后一个项目时,它突然用最后一篇文章中的错误数据更新了第一个项目,因为这是最后一篇文章。我不知道发生了什么,在我的日志中,我没有得到任何指示第一个项目正在更新的信息。 我从中得到了这个代码和想法 以下是我使用的代码: /** * Updates the like/dislike button states */ public void updateButtons() { Lis

我想更新
列表视图中的按钮。我目前拥有的代码工作正常,但有一个小故障,当到达最后一个项目时,它突然用最后一篇文章中的错误数据更新了第一个项目,因为这是最后一篇文章。我不知道发生了什么,在我的日志中,我没有得到任何指示第一个项目正在更新的信息。
我从中得到了这个代码和想法

以下是我使用的代码:

/**
     * Updates the like/dislike button states 
     */
    public void updateButtons() {
        ListView lv = ((ListView) findViewById(R.id.post_list));
        Log.d("Child Count: ", Integer.toString(lv.getCount()));
        int firstVisible;
        int child;
        for(int i=0; i < lv.getCount(); i++) {
            firstVisible = lv.getFirstVisiblePosition() - lv.getHeaderViewsCount();
            child = i - firstVisible;
            if(child < 0 || child >= lv.getChildCount()) {
                continue;
            }
            if(updated.contains(i)) continue;
            Log.d("Debug", "Updating child:" + Integer.toString(child));
            LinearLayout row = (LinearLayout) lv.getChildAt(child);
            if(likeable.get(i) == 0) {
                LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
                btn.setClickable(false);
                ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like_selected));
                TextView txtView = (TextView) row.findViewById(R.id.text_like);
                txtView.setTextColor(Color.parseColor("#60007c"));
            }
            if(dislikeable.get(i) == 0) {
                LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
                btn.setClickable(false);
                ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike_selected));
                TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
                txtView.setTextColor(Color.parseColor("#60007c"));
            }
            Log.d("Debug", "Adding child" + Integer.toString(i) + "TO the updated list");
            updated.add(i);
        }
    }

问题出在哪里还不是很清楚。当您滚动到最后一个项目时,第一个项目(来自适配器的项目或第一个可见的项目)再次更新

我个人的意见是你用了错误的方法。从这个问题来看,您似乎想更新
列表视图
中每一行中的一些按钮。您应该通过更新适配器中的数据并调用
notifyDataSetChanged()
而不是使用
OnScrollListener
来完成此操作。在用户操作(喜欢/不喜欢的项目)上这样做是有意义的,我怀疑您在用户滚动上创建了一个非常笨拙的喜欢/不喜欢系统


此外,如果您只想触摸可见的行,那么使用
lv.getCount()
迭代所有适配器项也没有意义(使用当前执行的代码,您可以一次性在适配器中执行更新并调用
notifyDatasetChanged()
)。使用
getFirstVisiblePosition()
getLastVisiblePosition()
。您可以通过不调用
updateButtons()
方法来优化代码,除非由于滚动而在屏幕上出现新行,您可以通过
onScroll()
方法的参数观察/计算新行(我看到一个
updated
列表,其中包含已更新的项目?!).

请尝试使用此代码。这对我很管用

您的适配器类如下所示

package com.rajesh.getselecteditem;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<Position> arraylist;

    ListAdapter(Context context, ArrayList<Position> products) {
        ctx = context;
        arraylist = products;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return arraylist.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Position pos = getselectedposition(position);
        ((TextView) view.findViewById(R.id.Textview1)).setText(""+pos.position);

        final ImageView imageView1 = (ImageView) view.findViewById(R.id.imageView1);

        CheckBox chkbox = (CheckBox) view.findViewById(R.id.cbBox);

        chkbox.setTag(position);
        chkbox.setChecked(pos.ischeckedflag);
        imageView1.setTag(position);



        chkbox.setOnCheckedChangeListener( new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                getselectedposition((Integer) buttonView.getTag()).ischeckedflag = isChecked;
                if(isChecked)
                {
                    imageView1.setVisibility(View.GONE);
                }
                else if(!isChecked)
                {
                    imageView1.setVisibility(View.VISIBLE);
                }
            }
        });


        return view;
    }

    Position getselectedposition(int position) {
        return ((Position) getItem(position));
    }

    ArrayList<Position> getcheckedposition() {
        ArrayList<Position> checkedposition = new ArrayList<Position>();
        for (Position p : arraylist) {
            if (p.ischeckedflag)
                checkedposition.add(p);
        }
        return checkedposition;
    }


}
<?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="wrap_content"
    android:orientation="horizontal" >

    <CheckBox
        android:id="@+id/cbBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical" >
    </CheckBox>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:orientation="vertical"
        android:layout_weight="1" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/Textview1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:text=""
            android:textSize="20sp" >
        </TextView>       
    </LinearLayout>

</LinearLayout>
只需使用列表视图设计main.xml类

您的listitem.xml如下所示

package com.rajesh.getselecteditem;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<Position> arraylist;

    ListAdapter(Context context, ArrayList<Position> products) {
        ctx = context;
        arraylist = products;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return arraylist.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Position pos = getselectedposition(position);
        ((TextView) view.findViewById(R.id.Textview1)).setText(""+pos.position);

        final ImageView imageView1 = (ImageView) view.findViewById(R.id.imageView1);

        CheckBox chkbox = (CheckBox) view.findViewById(R.id.cbBox);

        chkbox.setTag(position);
        chkbox.setChecked(pos.ischeckedflag);
        imageView1.setTag(position);



        chkbox.setOnCheckedChangeListener( new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                getselectedposition((Integer) buttonView.getTag()).ischeckedflag = isChecked;
                if(isChecked)
                {
                    imageView1.setVisibility(View.GONE);
                }
                else if(!isChecked)
                {
                    imageView1.setVisibility(View.VISIBLE);
                }
            }
        });


        return view;
    }

    Position getselectedposition(int position) {
        return ((Position) getItem(position));
    }

    ArrayList<Position> getcheckedposition() {
        ArrayList<Position> checkedposition = new ArrayList<Position>();
        for (Position p : arraylist) {
            if (p.ischeckedflag)
                checkedposition.add(p);
        }
        return checkedposition;
    }


}
<?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="wrap_content"
    android:orientation="horizontal" >

    <CheckBox
        android:id="@+id/cbBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical" >
    </CheckBox>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:orientation="vertical"
        android:layout_weight="1" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/Textview1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:text=""
            android:textSize="20sp" >
        </TextView>       
    </LinearLayout>

</LinearLayout>

好的,我自己解决了这个问题。问题不在代码中,也不是因为我的软件。这可能是我发现的一个安卓bug我必须再次显式设置数据,即使它是默认数据。这一准则起了作用:

if(likeable.get(i) == 0) {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
    btn.setClickable(false);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like_selected));
    TextView txtView = (TextView) row.findViewById(R.id.text_like);
    txtView.setTextColor(Color.parseColor("#60007c"));
} else {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
    btn.setClickable(true);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like));
    TextView txtView = (TextView) row.findViewById(R.id.text_like);
    txtView.setTextColor(Color.parseColor("#555555"));
}
if(dislikeable.get(i) == 0) {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
    btn.setClickable(false);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike_selected));
    TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
    txtView.setTextColor(Color.parseColor("#60007c"));
} else {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
    btn.setClickable(true);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike));
    TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
    txtView.setTextColor(Color.parseColor("#555555"));
}
为了确切地知道发生了什么,我尽可能多地描述了它。 我在上面代码的
else
部分设置的属性正是默认情况下在行上设置的属性(使用布局)。问题是当
if
不正确时(我们不需要做任何更改),我们只是跳过了它们。当滚动浏览列表时,他们被android覆盖了(下面是bug)。因此,我在代码(
else
部分)中将它们显式恢复为默认值,代码按预期工作


谢谢大家的回答。

Thx的答案,我指的是适配器上的第一项。我没有自定义适配器,我使用的是
SimpleAdapter
。我只是从服务器获取一个json字符串,解析它,确定是否有人已经喜欢/不喜欢特定的帖子,并根据它向用户显示按钮。这只需要做一次,当第一个职位后,按钮是不会改变获得。当所有帖子都出现在屏幕上时,它就工作了(预计会工作),但当帖子更多时,它就出错了。当我到达最后一个项目时,列表上的第一个项目(适配器)会更新(第一个项目从未出现在屏幕上..我怀疑它是如何更新的)。。问题是它更新错误。(它使用上一篇文章中的信息进行更新),更新后的列表包含已更新的行,因此我们不需要再次更新它们。(用于性能)。我创建列表是为了防止第一项再次更新,但它会更新。@MiroMarkarian从json文件中获取/解析列表后,简单地更新列表不是更容易吗?尤其是在列表没有更改的情况下?问题是我没有更新列表。我用列表中的数据更新按钮。这不是一个错误,
ListView
将在您上下滚动时回收行。您应该始终为您对行所做的任何更改提供默认值。然而,这并不能解释为什么它只发生在第一行。@Luksprog它发生在第一行,因为我只有6篇帖子。当滚动到最新版本时(因为最新版本太长),它覆盖了我所有的屏幕,所以子版本0变成了6号帖子。当滚动到第一篇文章时,它的设置与第六篇文章相同。如果帖子更多的话,其他帖子也会出现这种情况。然而,这太糟糕了,我不得不一直更新按钮。“这是太多无用的过程了。”卢克斯普罗格说,这真的很奇怪。我写了一个新的适配器,第一个条目与最后一个相同!!!!即使是文本和数据。。我的代码中一定有我遗漏的东西…我无法帮助,因为我看不到你的全部代码。但正如我在回答中已经说过的那样,我建议你重新思考你做事的方式。
if(likeable.get(i) == 0) {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
    btn.setClickable(false);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like_selected));
    TextView txtView = (TextView) row.findViewById(R.id.text_like);
    txtView.setTextColor(Color.parseColor("#60007c"));
} else {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
    btn.setClickable(true);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like));
    TextView txtView = (TextView) row.findViewById(R.id.text_like);
    txtView.setTextColor(Color.parseColor("#555555"));
}
if(dislikeable.get(i) == 0) {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
    btn.setClickable(false);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike_selected));
    TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
    txtView.setTextColor(Color.parseColor("#60007c"));
} else {
    LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
    btn.setClickable(true);
    ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike));
    TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
    txtView.setTextColor(Color.parseColor("#555555"));
}