Android変数の「位置」は内部クラス内からアクセスされ、finalとして宣言する必要があります



Android Variable Position Is Accessed From Within Inner Class



ナンセンスと最初の解決策について話しましょう:
図に示すように、getViewメソッドのintpositionパラメーターの前にfinalを追加します。
画像
Androidソフトウェアの開発時に作成するListViewは通常、いくつかのリスニングイベントを設定する必要があり、BaseAdapterは理想的なアダプターです。
本日、このアダプターの使用時に発生した小さな問題を記録しました
この問題の理由は、リストビューにボタンボタンを配置したためです。目的は、ボタンに対応する製品でデータ操作を実行することです。示されているように:
画像
インターフェースはあまり美しくなく、UIは軽くスプレーされています。 。
私が間違って報告したコードはこれです:
画像
実際、最初は、positionの値を取得するための変数を定義したかったのです。それは詐欺でした、そしてそれから私は成功しました!エラーなし!
コードは次のとおりです。

@Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder if (convertView == null) { convertView = View.inflate(getContext(), R.layout.listview, null) holder = new ViewHolder() holder.img = convertView.findViewById(R.id.img) holder.name = convertView.findViewById(R.id.gname) holder.price = convertView.findViewById(R.id.price) holder.date = convertView.findViewById(R.id.gdate) holder.add= convertView.findViewById(R.id.add) convertView.setTag(holder) } else { holder = (ViewHolder) convertView.getTag() } try { p=position//The p here is the static int I defined at the beginning (actually, it doesn’t matter if it’s not static, it’s irritating) final String url = goods.getJSONObject(position).getString('address') Glide.with(getContext()).load(url).into(holder.img) holder.name.setText(goods.getJSONObject(position).getString('gname')) holder.price.setText(goods.getJSONObject(position).getString('price')) holder.date.setText(goods.getJSONObject(position).getString('date')) holder.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { String gname = goods.getJSONObject(p).getString('gname')//P is used here instead of position int price =goods.getJSONObject(p).getInt('price') JSONObject good = new JSONObject() good.put('gname',gname) good.put('price',price) HttpUtil.connection(HomeFragment.class, good, 'AddGoodsServlet') } catch (JSONException e) { e.printStackTrace() } } }) } catch (JSONException e) { e.printStackTrace() }

その後、問題なくプログラムを実行しました
しかし、「Compike」に対応するボタンをクリックすると、データベースは、ショッピングカートにダンベルを追加したことを示していますか? ?マオの場合、ガン
それから私は深く考え、それを理解しました。この位置は最新のビューにのみ対応している必要があり、ダンベルはインターフェイスの最後に表示されるため、どのボタンをクリックしても、すでにダンベルの男です。
私の考えを検証するために、リストを下から上にめくった後、その位置は実際には新しく表示された上部のビューを指しています。
手段、 この位置は常に変化しています。既存のすべてのビューは、新しく表示されるビューとともに位置の値を変更します。
したがって、すでに生成された位置が変更されないようにするために、それをfinalとして定義すると、この問題は自然に解決されます。
私はおそらくこのアダプターをまだ理解していないので、この種の小さな問題を理解していません。今日はこれをここに記録して、印象を深めます。
PS:記事の知識ポイントは私の個人的な考えにすぎません。エラーがあれば、訂正してください。