繁体   English   中英

为什么当我单击任何列表项的按钮时,按钮的背景图像仅更改为最后一个列表项的按钮?

[英]Why background images of buttons are changing for last list item's button only,when I click on any list item's button?

我已经创建了带有适配器类的列表视图,其中在列表项中,我给出了三个按钮。 我需要更改该按钮和其他按钮的背景图像。 我有5个清单项目,每个项目都有自己的按钮。

现在,当我单击第一,第二至第五个列表项的按钮时,最后一张图像的背景仅在变化。 如果我单击各个按钮,则每个列表项按钮的背景图像应更改,具体取决于逻辑。 它仅在最后一个列表项中发生。

如果有人知道该怎么做,请帮助我。

代码是:

public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    init();

}

private void init() {

    LayoutInflater inflater1 = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          
    View view = inflater1.inflate(R.layout.datelabel, null);

    setListAdapter(new EventListAdapter(this));     

    ListView listView = getListView();
    listView.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

            Toast.makeText(MainActivity.this, "tapped on position " + position, Toast.LENGTH_SHORT).show();

            return false;
        }
    });


}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) 
{  
    ((EventListAdapter)getListAdapter()).toggle(position);

}
private class EventListAdapter extends BaseAdapter {
    private static final int VISIBLE = 0;


    private static final int GONE = 8;


    private TextView textViewForDateHeader;
    private TextView textViewTitle;
    private TextView textViewDialogue;

    private TextView textViewHeader;




    private ImageButton buttonForCheckMark;


    private ImageButton buttonForDelete;


    private View buttonForRemainder;



    public EventListAdapter(Context context)
    {
        mContext = context;
    }
    public int getCount() {
        return mTitles.length;
    }


    public Object getItem(int position) {
        return position;
    }


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

    public View getView(int position, View myView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);           
        myView = inflater.inflate(R.layout.activity_main, null);


        textViewTitle = (TextView) myView.findViewById(R.id.textViewTitle);
        textViewTitle.setText(mTitles[position]);

        textViewDialogue = (TextView) myView.findViewById(R.id.textViewDialog);
        textViewDialogue.setText(mDialogue[position]);
        textViewDialogue.setVisibility(mExpanded[position] ? VISIBLE : GONE);

        buttonForCheckMark = (ImageButton) myView.findViewById(R.id.buttonForCheckMark);
        buttonForCheckMark.setVisibility(mExpanded[position] ? VISIBLE : GONE);

        buttonForDelete = (ImageButton) myView.findViewById(R.id.buttonForDelete);
        buttonForDelete.setVisibility(mExpanded[position] ? VISIBLE : GONE);

        buttonForRemainder = (ImageButton) myView.findViewById(R.id.buttonForRemainder);
        buttonForRemainder.setVisibility(mExpanded[position] ? VISIBLE : GONE);

        buttonForRemainder.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this, "tapped on remainder", Toast.LENGTH_SHORT).show();

            }
        });
        buttonForCheckMark.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "tapped on checkMark", Toast.LENGTH_SHORT).show();
                buttonForCheckMark.setBackgroundResource(R.drawable.ic_launcher);
                buttonForDelete.setBackgroundResource(R.drawable.ic_navigation_cancel);
                buttonForCheckMark.setClickable(false);
                buttonForDelete.setClickable(true);
            }
        });
        buttonForDelete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "tapped on delete", Toast.LENGTH_SHORT).show();
                buttonForCheckMark.setBackgroundResource(R.drawable.ic_navigation_accept);
                buttonForCheckMark.setClickable(true);
                buttonForDelete.setBackgroundResource(R.drawable.ic_drawer);
                buttonForDelete.setClickable(false);
            }
        });


        return myView;
    }


    public void toggle(int position) {


        mExpanded[position] = !mExpanded[position];
        notifyDataSetChanged();


    }

    /**
     * Remember our context so we can use it when constructing views.
     */
    private Context mContext;


    /**
     * Our data, part 1.
     */
    //      private ImageButton[] mButtons = {
    //
    //              "R.drawable.remainder",
    //              
    //      };
    private String[] mHeader = 
        {
            "12 Jan, 2013",   
            "13 Feb, 2013",
            "31 Mar, 2013",       
            "15 Aug, 2013",
            "7 Sep, 2013"

        };


    /**
     * Our data, part 1.
     */
    private String[] mTitles = 
        {
            "Event 1",   
            "Event 2",
            "Event 3",       
            "Event 4",
            "Event 5"

        };

    /**
     * Our data, part 2.
     */
    private String[] mDialogue = 
        {
            "wuszuogwfuieffufuhuysugdueljwihadghgxdhgyhghsdgyigwuweyuqaGDHGYHGHGAdhgyhigxgxgeuyehu.",
            "dgusduugyujguegytgujgdugwjhiuyg7wtqUYGYYgyijyiufufjguhgdugfhgfhgfgfhgfhghfghifgyi,dgwsdtgyfytfiuwt,",
            "rtygygghtudggyjhgujtugdhhguyuaUUUUDJYUIDHUJHDIIDUJDHDUJHDIDIOUYhujtdugyhdgg",
            "gjhuwjsgudggdudgjqhasdgdhgjdhushjaguhguwegagsdgygydgfgdcgycg",
            "fhdgyhdfhfgdyhhwsddgyuduuufguugwugdfgugdgooduiuduiuduuduiuiuidudiiwdiou"


        };

    /**
     * Our data, part 3.
     */
    private boolean[] mExpanded = 
        {
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false   
        };


}

}

而不是在适配器中具有私有iVar。您应该将它们实例化为getView()方法中的final变量。当前在侦听器中设置新图像……但是变量指向最后创建的按钮的地址只要。

更新您的代码,这样

private class EventListAdapter extends BaseAdapter {
    /// other things

    //private TextView textViewForDateHeader; // remove such private vars

    .. other methods

    public View getView(int position, View myView, ViewGroup parent) {
          //other code

      final ImageButton  buttonForCheckMark = (ImageButton) myView.findViewById(R.id.buttonForCheckMark);

          buttonForCheckMark.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                buttonForCheckMark.setBackgroundResource(R.drawable.ic_launcher);
                //now the buttonForCheckMark refers to the imageview your instantiated above .. not the private var
               //other code
            }
        });

编辑

为了使高亮持久,请在适配器内部添加一个布尔数组。

 private boolean highlighted[];

EventListAdapter()内部也将其初始化为mTitles大小

  public EventListAdapter(Context context)
    {
            highlighted = new boolean[mTitles.length];
            mContext = context;
    }

现在在onListener中..检查highlighted [clickPos] == true ..禁用它,如果它为false ..将其设置为true; 您还可以使用此值将突出显示内容保留在getView()

getView方法中移动以下声明。

TextView textViewForDateHeader;
TextView textViewTitle;
TextView textViewDialogue;
TextView textViewHeader;
ImageButton buttonForCheckMark;
ImageButton buttonForDelete;
View buttonForRemainder;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM