Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – listview项目中的OnClickListener始终占据最后一行大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我从服务器下载数据并用它们填写listview.列表视图中的每个项目都有3个按钮,我想在每个按钮上创建一个onclicklistener.当用户单击其中一个按钮时,它应该例如打开新活动.每一行(对象)都有一些id,当我点击其中一些按钮时,id总是例如15(它总是listview中最后一行的id).
我试图用许多不同的方式声明OnClickListeners,结果是一样的.

LawsAdapter

public class LawsAdapter extends ArrayAdapter<Law> implements View.onClickListener {

private LayoutInflater inflater;
private Context context;

private UserLocalStore userLocalStore;
private IsVotedStorage isVotedStorage;
private View convertView;
private ViewHolder viewHolder;

/**
 * Constructor,declares storages,context and inflater
 * @param context
 * @param textViewresourcEID
 */
public LawsAdapter(Context context,int textViewresourcEID) {
    super(context,textViewresourcEID);
    this.context = context;
    inflater =  ((Activity) context).getLayoutInflater();
    userLocalStore = new UserLocalStore(context);
    isVotedStorage = new IsVotedStorage(context);
}

/**
 * Second constructor,here you can set the resource (againstr the prevIoUs onE)
 * @param context
 * @param resource
 * @param items
 */
public LawsAdapter(Context context,int resource,List<Law> items) {
    super(context,resource,items);
    this.context = context;
    inflater = (LayoutInflater) context.getSystemservice(Context.LAYOUT_INFLATER_serviCE);
    userLocalStore = new UserLocalStore(context);
    isVotedStorage = new IsVotedStorage(context);
}

/**
 * Overriden method getView,declares graphic objects (btns... ) and set listeners
 * @param position
 * @param convertView
 * @param parent
 * @return view
 */
@Override
public View getView(@R_489_2196@,View convertView,ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.law_item,parent,falsE);
        this.convertView = convertView;
        viewHolder = new ViewHolder();

        viewHolder.tvName = (TextView) convertView.findViewById(R.id.lawItemname);
        viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.lawItemDescription);
        viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.lawItemStatus);

        viewHolder.btnDownVote = (Button) convertView.findViewById(R.id.lawItemDownVote);
        viewHolder.btnUpVote = (Button) convertView.findViewById(R.id.lawItemUpVote);
        viewHolder.btnMakeComment = (Button) convertView.findViewById(R.id.lawItemMakeComment);
        viewHolder.currentLaw = getItem(position);
        Log.d("View holder","new one");
        Log.d("LAW ID,ADAPTER",String.valueOf(viewHolder.currentLaw.getId()));

        viewHolder.tvName.setText(viewHolder.currentLaw.getName());
        viewHolder.tvDescription.setText(viewHolder.currentLaw.getDescription());

        viewHolder.tvStatus.setText(viewHolder.currentLaw.getStateValue());

        setSurfacesColors();

        viewHolder.btnMakeComment.setOnClickListener(this);
        viewHolder.btnDownVote.setOnClickListener(this);
        viewHolder.btnUpVote.setOnClickListener(this);

        disableIfVoted();

        convertView.setTag(viewHolder);
    }
    else {
        viewHolder = (ViewHolder) convertView.getTag();
        Log.d("View holder","get tag");
    }

    return convertView;
}


/**
 * Set the colors of surfaces
 */
private void setSurfacesColors() {
    viewHolder.sfLeft = (SurfaceView) convertView.findViewById(R.id.lawItemSurfaceLeft);
    viewHolder.sfBACkground = (SurfaceView) convertView.findViewById(R.id.lawItemSurfaceBACkground);
    Log.d("VoteS","Positive: " +  viewHolder.currentLaw.getPositiveVotes() + " Negative: " + viewHolder.currentLaw.getNegativeVotes());
    if ((viewHolder.currentLaw.getNegativePercent() + viewHolder.currentLaw.getNegativeVotes()) > 1) {
        viewHolder.sfBACkground.setBACkgroundColor(context.getresources().getColor(R.color.redSurfaceBckg));
        viewHolder.sfLeft.setBACkgroundColor(context.getresources().getColor(R.color.btnSubmitColor));

        int screenWidth = getScreenWidth();
        int upVote = viewHolder.currentLaw.getNegativePercent();
        int downVote = viewHolder.currentLaw.getPositivePercent();
        int positivePixels = (screenWidth / 100) * upVote;
        int negativePixels = (screenWidth / 100) * downVote;

        viewHolder.sfBACkground.getHolder().setFixedSize(negativePixels,5);
        viewHolder.sfLeft.getHolder().setFixedSize(positivePixels,5);
        Log.d("updatE","NOTIFY");
    }
    else {
        viewHolder.sfBACkground.setBACkgroundColor(context.getresources().getColor(R.color.greySurfacE));
        viewHolder.sfLeft.setBACkgroundColor(context.getresources().getColor(R.color.greySurfacE));
    }
}

/**
 * UpVote
 * @param law
 */
private void upVote(Law law) {
    Serverrequest serverrequest = new Serverrequest(context);
    serverrequest.upVoteLawInBACkground(law.getId(),new UpDownCallBACk() {
        @Override
        public void done(Law law) {
            viewHolder.currentLaw = law;
            setSurfacesColors();
            Log.e("VoteS in UPVote","Positive: " + viewHolder.currentLaw.getPositiveVotes() + " Negative: " + viewHolder.currentLaw.getNegativeVotes());
        }
    });
}

/**
 * DownVote
 * @param law
 */
private void downVote(Law law) {
    Serverrequest serverrequest = new Serverrequest(context);
    serverrequest.downVoteLawInBACkground(law.getId(),new UpDownCallBACk() {
        @Override
        public void done(Law law) {
            viewHolder.currentLaw = law;
            setSurfacesColors();
        }
    });
}


/**
 * Get screen width in pixels
 * @return int screen width
 */
privatE int getScreenWidth() {
    WindowManager wm = (WindowManager) context.getSystemservice(Context.WINDOW_serviCE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(sizE);
    int width = size.x;
    return width;
}

/**
 * Disable voTing button if I have already Voted
 */
private void disableIfVoted() {
    if (isVotedStorage.isVoted(viewHolder.currentLaw.getId())) {
        viewHolder.btnUpVote.setEnabled(false);
        viewHolder.btnDownVote.setEnabled(false);
    }
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.lawItemMakeComment:
            if (userLocalStore.isUserLoggedIn()) {
                Log.d("ON CLICK LAW ID",String.valueOf(viewHolder.currentLaw.getId()));
                Intent commentsIntent = new Intent(context,DialogCommentsActivity.class);
                commentsIntent.putExtra("law_id",viewHolder.currentLaw.getId());
                commentsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOp);
                Log.d("CURRENT LAW",viewHolder.currentLaw.getId() + " " + viewHolder.currentLaw.getName());
                context.startActivity(commentsIntent);
            } else {
                context.startActivity(new Intent(context,DialogSignInActivity.class));
            }
            break;
        case R.id.lawItemDownVote:
            if (userLocalStore.isUserLoggedIn()) {
                isVotedStorage.setVoted(true,viewHolder.currentLaw.getId());
                downVote(viewHolder.currentLaw);
                disableIfVoted();
                notifyDataSetChanged();
            } else {
                context.startActivity(new Intent(context,DialogSignInActivity.class));
            }
            break;
        case R.id.lawItemUpVote:
            if (userLocalStore.isUserLoggedIn()) {
                isVotedStorage.setVoted(true,viewHolder.currentLaw.getId());
                upVote(viewHolder.currentLaw);
                disableIfVoted();
                notifyDataSetChanged();
            } else {
                context.startActivity(new Intent(context,DialogSignInActivity.class));
            }
            break;
    }
 }

/**
 * Holds items per row
 */
private static class ViewHolder {
    private TextView tvName;
    private TextView tvDescription;
    private TextView tvStatus;
    private Button btnUpVote;
    private Button btnDownVote;
    private Button btnMakeComment;
    private SurfaceView sfBACkground;
    private SurfaceView sfLeft;
    private Law currentLaw;
}

}

law_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://scheR_962_11845@as.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="170dp"
    android:gravity="bottom"
    android:padding="6pt"
    android:BACkground="@color/button_material_light">

    <RelativeLayout xmlns:android="http://scheR_962_11845@as.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:gravity="bottom"
        android:BACkground="@color/BACkground_floaTing_material_light"
        android:theme="@style/AppTheme"
        android:id="@+id/rel">


        <SurfaceView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/lawItemSurfaceBACkground"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <SurfaceView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lawItemSurfaceLeft"
            android:layout_alignBaseline="@+id/lawItemSurfaceBACkground"
            android:layout_alignBottom="@+id/lawItemSurfaceBACkground"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/lawItemname"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layouT_Below="@+id/lawItemSurfaceBACkground"
            android:layout_marginTop="2pt"
            android:layout_marginBottom="3pt"
            android:layout_marginLeft="3pt"
            android:layout_marginRight="3pt"
            android:padding="1pt"/>


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layouT_Below="@+id/lawItemname"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:padding="1pt"
            android:layout_marginLeft="3pt"
            android:layout_marginRight="3pt"
            android:layout_marginBottom="3pt"
            android:id="@+id/lawItemDescription" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="1pt"
            android:layout_marginBottom="3pt"
            android:id="@+id/lawItemStatus"
            android:layout_marginRight="30pt"
            android:layouT_Below="@+id/lawItemDescription"
            android:layout_alignParentright="true"
            android:layout_alignParentEnd="true" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="38dp"
            android:layouT_Below="@id/lawItemStatus"
            android:orientation="horizontal">


            <Button android:layout_weight="1"
                android:layout_height="wrap_content"
                android:BACkground="@color/btnSubmitColor"
                android:textColor="@color/btnSubmitTextColor"
                android:layout_width="match_parent"
                android:focusable="false"
                android:text="@String/button_upVote"
                android:id="@+id/lawItemUpVote" />

            <Button android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:BACkground="@color/btnSubmitColor"
                android:textColor="@color/btnSubmitTextColor"
                android:text="@String/button_downVote"
                android:focusable="false"
                android:id="@+id/lawItemDownVote" />

            <Button android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:BACkground="@color/btnSubmitColor"
                android:textColor="@color/btnSubmitTextColor"
                android:focusable="false"
                android:text="@String/button_comment"
                android:id="@+id/lawItemMakeComment" />
        </LinearLayout>

    </RelativeLayout>
</LinearLayout>

例:我在第一行单击btnMakeComment,新的Activity打开并从id为15的对象的db注释下载.然后我单击第三行中的btnMakeComment并打开新的Activity并从对象的db注释下载具有相同的ID,就像上次(再次15).
但是在ListView中不是相同的行/对象,它们在点击时是不同的,看起来它们会是相同的.

DialogCommentsActivity

/**
 * Activity for adding and reading comments
 */
public class DialogCommentsActivity extends AppCompatActivity implements AbsListView.onItemClickListener,AbsListView.onScrollListener,View.onClickListener {

    privatE int lawId;
    privatE int limit;
    privatE int offset;

    privatE int preLast;
    privatE int page;

    private ListView listView;
    private EditText etAddComment;
    private List<Comment> activityCommentList;
    private UserLocalStore userLocalStore;
    private User user;
    private Button btnSubmit;
    private CommentsAdapter commentsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        setContentView(R.layout.activity_comments_dialog);
        settitle("");
        setFinishOnTouchOutside(true);
        listView = (ListView) findViewById(R.id.commentDialogListView);
        limit = 5;
        offset = 0;
        page = 1;
        userLocalStore = new UserLocalStore(this);
        user = userLocalStore.getLoggedUser();

        etAddComment = (EditText) findViewById(R.id.commentDialogEditAdd);
        btnSubmit = (Button) findViewById(R.id.commentsDialogSubmit);
        btnSubmit.setEnabled(false);

        listView.setOnItemClickListener(this);
        listView.setOnScrollListener(this);
        btnSubmit.setOnClickListener(this);

        Bundle extras = geTintent().getExtras();
        String userName;
        dumpIntent(geTintent());
        if (extras != null) {
            lawId = extras.geTint("law_id");
        }
        Log.e("LAW ID HOHOHO",String.valueOf(lawId));
        fillAdapter(limit,offset);

        etAddComment.addTextChangedListener(new TextWatcher() {

            @Override
            public void ontextChanged(CharSequence s,int start,int before,int count) {
                if (s.toString().trim().length() == 0) {
                    btnSubmit.setEnabled(false);
                } else {
                    btnSubmit.setEnabled(true);
                }
            }
            @Override
            public void beforeTextChanged(CharSequence s,int count,int after) {
                // TODO Auto-generated method stub
            }
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
            }
        });
    }

    @Override
    public Boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_detail_law,menu);
        return true;
    }

    @Override
    public Boolean onOptionsItemSELEcted(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button,so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_setTings) {
            return true;
        }

        return super.onOptionsItemSELEcted(item);
    }

    @Override
    public void onScrollStateChanged(AbsListView view,int scrollStatE) {

    }

    @Override
    public void onScroll(AbsListView absListView,int firstVisibleItem,int visibleItemCount,int @R_892_10586@lItemCount) {
        switch(listView.getId()) {
            case R.id.commentDialogListView:
                Log.d("SCROLL","scroll");
                Boolean loadMore =  firstVisibleItem + visibleItemCount >= @R_892_10586@lItemCount-1;
                if (loadMorE) {
                    page += 1;
 //                   offset = (page * limit) - limit + 1;
 //                   fillAdapter(limit,offset);
//                    commentsAdapter.notifyDataSetChanged(); TODO
                }
        }
    }


    @Override
    public void onItemClick(AdapterView<?> parent,View view,@R_489_2196@,long id) {
    }

    public void fillAdapter(int limit,int offset) {
        Serverrequest serverrequest = new Serverrequest(this);
        Log.e("LAWID BEFORE requEST",String.valueOf(lawId));
        serverrequest.fetchCommentsInBACkground(lawId,limit,offset,new GetCommentsCallBACk() {
            @Override
            public void done(List<Comment> comments) {
                commentsAdapter = new CommentsAdapter(getApplicationContext(),R.layout.comment_item,comments);
                listView.setAdapter(commentsAdapter);
                activityCommentList = commentsAdapter.getList();
            }
        });
    }

    public void loadData(int limit,new GetCommentsCallBACk() {
            @Override
            public void done(List<Comment> comments) {
                // updating parsed JSON data into ListView
                for (Comment comment : comments) {
                    Log.d("COMMENT OBjeCT",comment.getText());
                    activityCommentList.add(comment);
                }
            }
        });
    }

    /**
     * Handle click events,comments adding
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.commentsDialogSubmit:
                String text = String.valueOf(etAddComment.getText());
                Date dt = new Date();
                Log.d("Click","Click");

                if (userLocalStore.isUserLoggedIn()) {
                    Log.e("LAW ID NEW COMM",String.valueOf(lawId));
                    Comment comment = new Comment(text,dt,user,lawId);
                    addComment(comment);
                    etAddComment.setText("");

                    //notifyData(limit,offset);
                    limit = 15;
                    offset = 0;
                    fillAdapter(limit,offset);
                    commentsAdapter.notifyDataSetChanged();
                    Log.e("numbER OF COMMENTS",String.valueOf(activityCommentList.size()));
                }
                break;
        }
    }

    /**
     * Insert comment
     * @param comment
     */
    public void addComment(Comment comment) {
        Serverrequest serverrequest = new Serverrequest(this);
        serverrequest.storeCommenTinBACkground(comment,new GetCommentsCallBACk() {
            @Override
            public void done(List<Comment> list) {
                Log.d("Comment","Comment was added.");
            }
        });
    }


    private void dumpIntent(Intent i) {
        Bundle bundle = i.getExtras();
        if (bundle != null) {
            Set<String> keys = bundle.keySet();
            Iterator<String> it = keys.iterator();
            Log.e("EXTRAS","Dumping Intent start");
            while (it.hasNext()) {
                String key = it.next();
                Log.e("EXTRAS","[" + key + "=" + bundle.get(key) + "]");
            }
            Log.e("EXTRAS","Dumping Intent end");
        }
    }

}

解:

添加了ViewHolder viewHolder = v.getTag();在每个监听器中(以及在每个按钮上的getView中的setTag(viewHolder)之前)

@Override
    public View getView(@R_489_2196@,ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.law_item,falsE);
            this.convertView = convertView;
            viewHolder = new ViewHolder();

            viewHolder.position = position;
            viewHolder.tvName = (TextView) convertView.findViewById(R.id.lawItemname);
            viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.lawItemDescription);
            viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.lawItemStatus);

            viewHolder.btnDownVote = (Button) convertView.findViewById(R.id.lawItemDownVote);
            viewHolder.btnUpVote = (Button) convertView.findViewById(R.id.lawItemUpVote);
            viewHolder.btnMakeComment = (Button) convertView.findViewById(R.id.lawItemMakeComment);

            viewHolder.btnMakeComment.setTag(viewHolder);
            viewHolder.btnDownVote.setTag(viewHolder);
            viewHolder.btnUpVote.setTag(viewHolder);

            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
            Log.d("View holder","get tag");
        }

        viewHolder.currentLaw = getItem(position);
        Log.d("View holder",String.valueOf(viewHolder.currentLaw.getId()));

        viewHolder.tvName.setText(viewHolder.currentLaw.getName());
        viewHolder.tvDescription.setText(viewHolder.currentLaw.getDescription());

        viewHolder.tvStatus.setText(viewHolder.currentLaw.getStateValue());

        setSurfacesColors();

        disableIfVoted();

        viewHolder.btnMakeComment.setOnClickListener(onCommentClickListener);
        viewHolder.btnDownVote.setOnClickListener(onDowvnVoteClickListener);
        viewHolder.btnUpVote.setOnClickListener(onUpVoteClickListener);


     //   viewHolder.btnMakeComment.setOnClickListener(onCommentClickListener);




        return convertView;
    }

    @Override
    public long getItemId(@R_489_2196@) {
        return laws.get(position).getId();
    }

    @Override
    public Law getItem(@R_489_2196@) {
        return laws.get(position);
    }



    /**
     * On upVote listener
     */
    private View.onClickListener onUpVoteClickListener = new View.onClickListener() {
        @Override
        public void onClick(View v) {
            ViewHolder viewHolder = (ViewHolder) v.getTag();
            if (userLocalStore.isUserLoggedIn()) {
                isVotedStorage.setVoted(true,DialogSignInActivity.class));
            }
        }
    };

    /**
     * On downVote listener
     */
    private View.onClickListener onDowvnVoteClickListener = new View.onClickListener() {
        @Override
        public void onClick(View v) {
            ViewHolder viewHolder = (ViewHolder) v.getTag();
            if (userLocalStore.isUserLoggedIn()) {
                isVotedStorage.setVoted(true,DialogSignInActivity.class));
            }
        }
    };

    /**
     * On comment listener,open comment dialog
     */
    private View.onClickListener onCommentClickListener = new View.onClickListener() {
        @Override
        public void onClick(View v) {
            ViewHolder viewHolder = (ViewHolder) v.getTag();
            if (userLocalStore.isUserLoggedIn()) {
                Log.d("ON CLICK LAW ID",DialogSignInActivity.class));
            }
        }
    };

解决方法

您每次都会获得最后一个ID /最后一行位置,因为最后一个视图最后会显示

要在按钮上单击行位置,可以将postion设置为按钮的标签,并在onclickListner中检查该标签

例如,在你的getview()方法中,将position作为标记放在viewHolder.btnMakeComment按钮中

viewHolder.btnMakeComment.setTag(位置);并在OnClickListner检查标签@R_489_2196@ =(int)v.getTag();

大佬总结

以上是大佬教程为你收集整理的android – listview项目中的OnClickListener始终占据最后一行全部内容,希望文章能够帮你解决android – listview项目中的OnClickListener始终占据最后一行所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。