My video problemMeine RecyclerView-Elemente verwechseln die Position, als ich geklickt habe?
Ich habe Probleme mit meiner Artikelauswahl in RecyclerView. Wenn ich klicke, erscheint ein Gegenstand als lila Überlagerung, aber wenn ich zu einem anderen Bildschirm blättere, erscheint es für ein anderes Objekt, und wenn ich zurück blättern kann, verschwindet das alte Objekt-Overlay. Ich weiß nicht, was los ist :(Wie zu beheben es ???
RecyclerView_Adapter
package basic.zhenyuan0502.nguyenlt.armstore;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.percent.PercentLayoutHelper;
import android.support.percent.PercentRelativeLayout;
import android.support.v17.leanback.widget.BaseCardView;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.SparseBooleanArray;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* Created by Heisenberg on 17/04/2016.
*/
public class RecyclerView_Adapter<VH extends RecyclerView_Adapter.ViewHolder> extends RecyclerView.Adapter<VH> {
ArrayList<Item> arrayList = new ArrayList<Item>();
private Context context;
private int focusedItem = 0;
public RecyclerView_Adapter(Context context, ArrayList<Item> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@Override
public int getItemCount() {
return arrayList.size();
}
@Override
public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
recyclerView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();
// Return false if scrolled to the bounds and allow focus to move off the list
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
return tryMoveSelection(lm, 1);
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
return tryMoveSelection(lm, -1);
}
}
return false;
}
});
}
private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) {
int tryFocusItem = focusedItem + direction;
if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) {
notifyItemChanged(focusedItem);
focusedItem = tryFocusItem;
notifyItemChanged(focusedItem);
lm.scrollToPosition(focusedItem);
return true;
}
return false;
}
@Override
public void onBindViewHolder(final VH vHolder, int position) {
final Item item = arrayList.get(position);
vHolder.ivItem.setImageResource(item.getIvItem());
vHolder.tvPrice.setText(item.getTvPrice());
vHolder.tvName.setText(item.getTvName());
vHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View v, int position) {
vHolder.itemView.setSelected(focusedItem == position);
//notifyItemChanged(focusedItem);
focusedItem = position;
vHolder.selected_overlay.setVisibility(View.VISIBLE);
// notifyItemChanged(focusedItem);
}
});
}
@Override
public VH onCreateViewHolder(ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
ViewGroup mainGroup = (ViewGroup) inflater.inflate(
R.layout.themeblue_item_recyclerview, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(mainGroup);
return (VH) viewHolder;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ItemClickListener itemClickListener;
public TextView tvPrice, tvName;
public ImageView ivItem;
public LinearLayout llItem;
public CardView cvItem;
public View selected_overlay;
public ViewHolder(View convertView) {
super(convertView);
ivItem = (ImageView) convertView.findViewById(R.id.ivItem);
tvPrice = (TextView) convertView.findViewById(R.id.tvPrice);
tvName = (TextView) convertView.findViewById(R.id.tvName);
llItem = (LinearLayout) convertView.findViewById(R.id.llItem);
cvItem = (CardView) convertView.findViewById(R.id.cvItem);
selected_overlay = (View) convertView.findViewById(R.id.selected_overlay);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
this.itemClickListener.onItemClick(v, getLayoutPosition());
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
}
}
themeblue_item_recyclerview
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cvItem"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardBackgroundColor="@android:color/transparent">
<ImageView
android:id="@+id/ivItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
<LinearLayout
android:id="@+id/llItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_vertical"
android:background="#50000000"
android:orientation="vertical">
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="Name"
android:textColor="#FFFFFF"
android:textSize="12sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvPrice"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="Price"
android:textColor="#FFFF26"
android:textSize="12sp"
android:textStyle="bold" />
</LinearLayout>
<View
android:id="@+id/selected_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#88673AB7"
android:visibility="invisible" />
</android.support.v7.widget.CardView>
OrderActivity: Sie konzentrieren sich nur auf runOnUiThread und lvDetailMiddle
package basic.zhenyuan0502.nguyenlt.armstore;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.percent.PercentLayoutHelper;
import android.support.percent.PercentRelativeLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.sileria.android.Kit;
import com.sileria.android.view.HorzListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
public class OrderActivity extends AppCompatActivity {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private String IP = "192.168.1.5";
private String PORT_SSL = "8080";
private final String LOGIN_URL = "http://" + IP + ":" + PORT_SSL + "/armstore/json.php";
// private ArrayList<TwoItem> arrayList = new ArrayList<>();
private ArrayList<Item> arrayList = new ArrayList<>();
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
RecyclerView lvDetailMiddle;
RecyclerView_Adapter adapter;
private static String docNoiDung_Tu_URL(String theUrl) {
StringBuilder content = new StringBuilder();
try {
URL url = new URL(theUrl);
URLConnection urlConnection = url.openConnection();
wrap the urlconnection in a bufferedreader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
content.append(line + "\n");
}
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
return content.toString();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
Kit.init(this);
super.onCreate(savedInstanceState);
//Set full screen open
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getSupportActionBar().hide(); //Use to hide ActionBar with theme AppCompat
//Set full screen close
setContentView(R.layout.activity_order_oneline_item);
//ListView TopBar
final HorzListView lvTopBar = (HorzListView) findViewById(R.id.lvTopBar);
String[] arrTxt = {"Món 1", "Món 2", "Món 3", "Món 4",
"Món 5", "Món 6", "Món 7", "Món 8", "Món 9", "Món 10"};
ArrayAdapter<String> adapterStringlvTopBar = new ArrayAdapter<>(this,
R.layout.themeblue_menu_horzlistview, arrTxt);
lvTopBar.setAdapter(adapterStringlvTopBar);
//ListView BottomBar
final HorzListView lvBottomBar = (HorzListView) findViewById(R.id.lvBottomBar);
ArrayAdapter<String> adapterStringlvBottomBar = new ArrayAdapter<>(this,
R.layout.themeblue_menu_horzlistview, arrTxt);
lvBottomBar.setAdapter(adapterStringlvBottomBar);
lvTopBar.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
lvBottomBar.getSelectedView().setSelected(false);
Toast.makeText(getApplicationContext(), "Chọn " + position, Toast.LENGTH_SHORT).show();
}
});
lvBottomBar.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
lvTopBar.getSelectedView().setSelected(false);
Toast.makeText(getApplicationContext(), "Chọn " + position, Toast.LENGTH_SHORT).show();
}
});
//EditText Search
final EditText etSearch = (EditText) findViewById(R.id.etSearch);
Button btnDelete = (Button) findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etSearch.setText("");
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
new readJSON().execute(LOGIN_URL);
}
});
lvDetailMiddle = (RecyclerView)
findViewById(R.id.lvMiddle);
lvDetailMiddle.setHasFixedSize(true);
adapter = new RecyclerView_Adapter(OrderActivity.this, arrayList);
adapter.notifyDataSetChanged();
lvDetailMiddle.setAdapter(adapter);
lvDetailMiddle.setItemAnimator(new DefaultItemAnimator());
lvDetailMiddle
.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL));
ImageButton ibtnDetail = (ImageButton) findViewById(R.id.ibtnDetail);
ibtnDetail.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplication(), ProcessActivity.class);
startActivity(intent);
}
}
);
gestureDetector = new GestureDetector(this, new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
Kit.destroy();
}
@Override
public void onBackPressed() {
OrderActivity.this.finish();
}
@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_main, 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);
}
class readJSON extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
return docNoiDung_Tu_URL(params[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//ArrayList<String> arrProduct = new ArrayList<String>();
try {
JSONArray mang = new JSONArray(s);
for (int i = 0 ; i < mang.length(); ++i) {
JSONObject product = mang.getJSONObject(i);
arrayList.add(new Item(product.getString("name"),product.getString("price"),R.drawable.themeblue_logo_store_small));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(OrderActivity.this, "Đang cuộn <-", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(OrderActivity.this, "Đang cuộn ->", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
}
Ich habe versucht, aber nicht erfolgreich :( –