بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
کیا با recyclerView کار کردن؟
کیا با recyclerView کار کردن؟
به یه مشکل عجیب برخوردم توش نمی دونم چیجوری توضیح بدم ، اگه کسی کار کرده بگه
0
0
اوووووف هیشکی کار نمیکنه؟ (11 سال پیش)
0
0
مشکلتون چیه؟ (11 سال پیش)
+1
0
ای بابا...کلافه شدیم بخدا با این اسپم کیلر لعنتی (11 سال پیش)
0
0
مشکلم اینه که وقتی لیست رو ساختم و دارم تست میکنم ، در حالی که اسکرول می کنم میبینم یه آیتم جلو چشام مقدارش عوض میشه ، با اسکرول مقدار یه آیتم دیگرو به خودش میگیره (11 سال پیش)
برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال
حمید زمانی
11 سال پیش
0
0
Adapter :
public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
Item[] itemsStatic;
public AdapterList(ArrayList<Item> it) {
itemsStatic = new Item[it.size()];
for(int i=0; i<it.size(); i++){
itemsStatic[i] = it.get(i);
}
}
//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtItem;
public static ImageView imgItem;
public static LinearLayout lnlItem;
public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}
//Create new views
@Override
public AdapterList.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
viewHolder.txtItem.setText(itemsStatic[i].title);
viewHolder.imgItem.setImageResource(G.c.getResources().getIdentifier(itemsStatic[i].image,"drawable",G.c.getPackageName()));
}
@Override
public int getItemCount() {
return itemsStatic.length;
}
}
Activity :
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
RecyclerView.Adapter adapter = new AdapterList(G.items);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
Xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#e0e0e0">
<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
<android.support.v7.widget.RecyclerView
android:layout_below="@+id/tool_bar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/recycler_view" />
<ImageButton
android:id="@+id/fab_image_button"
android:layout_width="@dimen/fab_button_diameter"
android:layout_height="@dimen/fab_button_diameter"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/fab_button_margin_bottom"
android:layout_marginLeft="@dimen/fab_button_margin_right"
android:background="@drawable/fab_shape"
android:src="@drawable/fab_ic_add"
android:tint="@android:color/white"/>
</RelativeLayout>
build.gradle :
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
compile 'com.android.support:cardview-v7:21.0.3'
}
پاسخ به سوال
حمید زمانی
11 سال پیش
0
0
public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
ArrayList<Note> items;
public AdapterList(ArrayList<Note> items) {
this.items = items;
}
//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtTitle;
public static TextView txtText;
public ViewHolder(View v){
super(v);
txtTitle = (TextView) v.findViewById(R.id.txt_title);
txtText = (TextView) v.findViewById(R.id.txt_text);
}
}
//Create new views
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout,viewGroup,false);
return new ViewHolder(view);
}
//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
Note n = items.get(i);
if(n.title == null){
viewHolder.txtTitle.setText("");
}else{
viewHolder.txtTitle.setText(n.title);
}
if(n.text == null){
viewHolder.txtText.setText("");
}else{
viewHolder.txtText.setText(n.text);
}
}
@Override
public int getItemCount() {
return items.size();
}
}
اینم با آرایه ی داینامیک ولی همون مشکل هنوز پا برجاست.
پاسخ به سوال
احسان منصوری
11 سال پیش
+4
0
ببینید، من از این کد استفاده میکنم. مشکلی هم ندارم.
کد اداپتر:
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.viewHolder>{
Context context;
private LayoutInflater inflater;
public AdapterRecyclerView(Context context, List<Information> data){
inflater=LayoutInflater.from(context);
G.recyclerList= (java.util.ArrayList<Information>) data;
}
@Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.adapter_recycler, parent, false);
viewHolder holder = new viewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(viewHolder holder, final int position) {
final LocationManager manager = (LocationManager) G.context.getSystemService(Context.LOCATION_SERVICE);
Information current = G.recyclerList.get(position);
holder.title.setText(current.p_uname);
holder.desc.setText(current.p_desc);
String url = current.p_logo;
Log.e("LOG", "URL_IMAGE_UNIVERSAL: " + url);
holder.btnProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
holder.btnRouting.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return G.recyclerList.size();
}
class viewHolder extends RecyclerView.ViewHolder{
TextView title;
TextView desc;
FrameLayout btnProfile;
FrameLayout btnRouting;
ImageView image;
public viewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.txtTitle);
desc = (TextView) itemView.findViewById(R.id.txtDesc);
btnProfile = (FrameLayout) itemView.findViewById(R.id.btnProfile);
btnRouting = (FrameLayout) itemView.findViewById(R.id.btnRouting);
image = (ImageView) itemView.findViewById(R.id.imageView);
}
}
}
اینم کدی هست که اطلاعات رو از سرور میگیرم و با اداپتر RecyclerView ست میکنم:
توی onCreate:
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(G.context);
recyclerView.setLayoutManager(layoutManager);
اینم AsyncTask برای دریافت اطلاعات از سرور:
public class asyncRecyclerview extends AsyncTask<Void, Void, List<Information>> {
protected void onPreExecute() {
super.onPreExecute();
dialog3 = ProgressDialog.show(G.currentActivity, "", "در حال بارگزاری...", true);
}
@Override
protected List<Information> doInBackground(Void... params) {
//Read URL For Receive Json Code
String result = Webservice.readUrl(url);
Log.i("LOG", "URLRESULT: "+ result);
if (result != null) {
try {
G.recyclerList.clear();
JSONArray jsonurl = new JSONArray(result);
for (int i = 0; i < jsonurl.length(); i++) {
JSONObject object = jsonurl.getJSONObject(i);
Information url = new Information();
String img_url = object.getString("p_logo");
url.p_logo = (G.ip + "images/" + img_url);
url.p_uname = object.getString("p_uname");
url.p_desc = object.getString("p_desc");
url.p_uid = object.getInt("p_uid");
G.recyclerList.add(url);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return G.recyclerList;
}
@Override
protected void onPostExecute(List<Information> result) {
super.onPostExecute(result);
//tarif va meghdar dehie RecyclerView
adapter = new AdapterRecyclerView(G.context, result);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(G.context));
recyclerView.setLayoutManager(new LinearLayoutManager(G.currentActivity, LinearLayoutManager.HORIZONTAL, false));
//end
dialog3.dismiss();
}
}
و در آخر هم Async رو داخل onCreate اجرا میکنید
new asyncRecyclerview().execute();
اینی که نوشتم به نظرم راحتترین روش پیاده سازی RecyclerView بود.
پاسخ به سوال
حمید زمانی
11 سال پیش
+2
0
مشکل پیدا شد :
همونطوری که آقای Hajhosseini فرموده بودند هیچکدام از ویو ها نباید استاتیک باشه و با تغییر کلاس ViewHolder به کد زیر مشکل حل شد ، از همه دوستان تشکر میکنم ، مخصوصا حسین احمدی (CodeMaster) که تلفنی راهنماییم کرد.
public class ViewHolder extends RecyclerView.ViewHolder{
TextView txtItem;
ImageView imgItem;
LinearLayout lnlItem;
public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .