کلیدستان

نسخه‌ی کامل: مشکل در ساخت دو لیست ویو شخصی (در اندروید)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان.. خسته نباشید..
من یه کاستوم لیست درست کردم واسه یه لیستم..
ولی وقتی یه لیست ویو دیگه میسازم ، دیزاین این روی لیست ویوی جدیدم تاثیر میزاره. میخوام ک فقط یه لیست ویو از این کد استفاده کنه.
چجوری میتونم دوتا کاستوم داشته باشم؟
اینم کدش :

سلام.
شما روش getView را به طور کلی نوشته اید (نه داخل یک adapter). بنابراین وقتی دو تا ListView داریم، هر دوی آنها را تغییر می دهد. 
ابتدا یک backup از پروژه اندروید خود تهیه کنید، سپس این موارد را انجام بدهید :
نوع کلاس (Class) را به ListActivity تغییر بدهید (از ArrayAdapter به ListActivity). سپس دو ListView را شناسایی می کنید (تگ آنها درون فایل xml نوشته می شود که باید دارای id های متفاوت باشند)، اما برای هر کدام، یک adapter جداگانه تعریف می کنید که هر کدام از آن دو adapter ، کدهای مربوط به روش getView خود را دارد.
برای درک بهتر تعریف adapter ، کلید زیر را ببینید (البته برای کلید زیر، چون یک ListView داشتیم، کدهای شناسایی ListView به دردتون نمی خوره و باید دو ListView را بر اساس id آنها شناسایی کنید) :

کلید شماره 843

که در آن، اینگونه برای ListView ، یک adapter ساخته ایم (کدهای adapter) :

کد پی‌اچ‌پی:
private class MyAdapter extends ArrayAdapter<String>{

                public 
MyAdapter(Context contextint resourceint textViewResourceId,
                                
String[] strings) {
                        
super(contextresourcetextViewResourceIdstrings);
                        
// TODO Auto-generated constructor stub
                
}
                
                @
Override
                
public View getView(int positionView convertViewViewGroup parent) {
                        
LayoutInflater inflater = (LayoutInflatergetSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        
View row inflater.inflate(R.layout.list_itemparentfalse);
                        
                        
String stringName "string_key_" String.valueOf(position+1); 
                        
int string_res_ID getResources().getIdentifier(stringName,"string",getPackageName());
                        
String my_string getResources().getString(string_res_ID);
                        
TextView tv = (TextViewrow.findViewById(R.id.textView1);
                        
tv.setText(my_string);
                        
                        
String imageName "key_" String.valueOf(position+1); 
                        
int image_res_ID getResources().getIdentifier(imageName,"drawable",getPackageName());
                        
ImageView iv = (ImageViewrow.findViewById(R.id.imageView1);
                        
iv.setImageResource(image_res_ID);
        
                        return 
row;
                }
                
                
        } 

شما یک adapter دیگر با نامی متفاوت می نویسید که برای ListView دوم به کار خواهد رفت. هر adapter هم کدهای روش getView مربوط به خود را دارد (جدا از یکدیگر).

(۱۳۹۳/۰۹/۲۶, ۰۷:۳۲ ب.ظ)'admin' نوشته: [ -> ]سلام.
شما روش getView را به طور کلی نوشته اید (نه داخل یک adapter). بنابراین وقتی دو تا ListView داریم، هر دوی آنها را تغییر می دهد. 
ابتدا یک backup از پروژه اندروید خود تهیه کنید، سپس این موارد را انجام بدهید :
نوع کلاس (Class) را به ListActivity تغییر بدهید (از ArrayAdapter به ListActivity). سپس دو ListView را شناسایی می کنید (تگ آنها درون فایل xml نوشته می شود که باید دارای id های متفاوت باشند)، اما برای هر کدام، یک adapter جداگانه تعریف می کنید که هر کدام از آن دو adapter ، کدهای مربوط به روش getView خود را دارد.
برای درک بهتر تعریف adapter ، کلید زیر را ببینید (البته برای کلید زیر، چون یک ListView داشتیم، کدهای شناسایی ListView به دردتون نمی خوره و باید دو ListView را بر اساس id آنها شناسایی کنید) :

کلید شماره 843

که در آن، اینگونه برای ListView ، یک adapter ساخته ایم (کدهای adapter) :

کد پی‌اچ‌پی:
private class MyAdapter extends ArrayAdapter<String>{

                public 
MyAdapter(Context contextint resourceint textViewResourceId,
                                
String strings) {
                        
super(contextresourcetextViewResourceIdstrings);
                        
// TODO Auto-generated constructor stub
                
}
                
                @
Override
                
public View getView(int positionView convertViewViewGroup parent) {
                        
LayoutInflater inflater = (LayoutInflatergetSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        
View row inflater.inflate(R.layout.list_itemparentfalse);
                        
                        
String stringName "string_key_" String.valueOf(position+1); 
                        
int string_res_ID getResources().getIdentifier(stringName,"string",getPackageName());
                        
String my_string getResources().getString(string_res_ID);
                        
TextView tv = (TextViewrow.findViewById(R.id.textView1);
                        
tv.setText(my_string);
                        
                        
String imageName "key_" String.valueOf(position+1); 
                        
int image_res_ID getResources().getIdentifier(imageName,"drawable",getPackageName());
                        
ImageView iv = (ImageViewrow.findViewById(R.id.imageView1);
                        
iv.setImageResource(image_res_ID);
        
                        return 
row;
                }
                
                
        } 

شما یک adapter دیگر با نامی متفاوت می نویسید که برای ListView دوم به کار خواهد رفت. هر adapter هم کدهای روش getView مربوط به خود را دارد (جدا از یکدیگر).



 

ممنون از راهنمایی..  
اگه بخوام کلاسم اکستند اکتیوتی باشه نه لیست اکتیویتی چطور اینکارو کنم؟ 

 
(۱۳۹۳/۰۹/۲۶, ۱۰:۲۱ ب.ظ)'ahh90' نوشته: [ -> ]ممنون از راهنمایی..  
اگه بخوام کلاسم اکستند اکتیوتی باشه نه لیست اکتیویتی چطور اینکارو کنم؟ 
 

باید از کدهایی استفاده کنید که روش های (method) به کار رفته در آن، در کلاس Activity موجود باشد. مثلا شما اگر یک ListView را در کلاس ListActivity بسازید (کدهایی که معمولا در ListActivity به کار می روند و بدون هیچ خطایی)، بعد کلاس ListActivity را به کلاس Activity تغییر بدهید، برنامه eclipse به شما اخطار می دهد که برخی روش هایی که نوشته اید، برای کلاس Activity تعریف نشده (چون آنها برای کلاس ListActivity بوده اند). بنابراین اگر قصد دارید که حتما کلاس Activity باشد، ابتدا باید ببینید که چه کدهایی براس ساخت ListView در آن به کار می رود و ببینید که آیا خواسته های شما را برآورده می کنند یا خیر.

ی راه حل درست 

کد پی‌اچ‌پی:
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
 
public class 
AlphabetListDemo extends Activity {
    
//String of alphabets //
    
String alphabts = {"A","B","C","D","E","F","G","H","I","J","K","L"};
    
ListView L1L2;
    
myAdapter myadp;
    
myAdapter2 myadp2;
    
String prod_arr = {};
 
    @
Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.main);
 
        
L1 = (ListView)findViewById(R.id.list1);
        
L2 = (ListView)findViewById(R.id.list2);
 
        
myadp = new myAdapter(this,alphabts);
        
L2.setAdapter(myadp);
 
        
// initial populating //
        
setProducts(0);
 
        
L2.setOnItemClickListener(new OnItemClickListener(){
            @
Override
            
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                setProducts(arg2);
            }
        });
 
    }
 
    public void setProducts(int number){
        prod_arr = new String[25];
        // adding some dummy data //
        for(int i = 0; i < 25 ; i++){
            prod_arr[i] = "Product : " + alphabts[number] + i;
        }
        //setting the adapter in listview //
         myadp2 = new myAdapter2(AlphabetListDemo.this,prod_arr);
         L1.setAdapter(myadp2);
    }
 
    class myAdapter extends ArrayAdapter<String>
    {
       TextView label;
       ImageView image;
       View row;
       public myAdapter(Context context,String arr)
       {
            super(context, android.R.layout.simple_list_item_1, arr);
       }
 
       public View getView(final int position, View convertView, ViewGroup parent)
        {
               try{
                    LayoutInflater inflater=getLayoutInflater();
                    row = inflater.inflate(R.layout.lv_rows, parent, false);
                    label = (TextView)row.findViewById(R.id.item_title);
                    label.setText(alphabts[position]);
                    label.setTextColor(Color.YELLOW);
               }catch(Exception e){
 
               }
            return row;
        }
    }
    // adapter for second list.....
    class myAdapter2 extends ArrayAdapter<String>
    {
       TextView label;
       ImageView image;
       View row;
       public myAdapter2(Context context,String arr)
       {
            super(context, android.R.layout.simple_list_item_1, arr);
       }
 
       public View getView(final int position, View convertView, ViewGroup parent)
        {
               try{
                    LayoutInflater inflater=getLayoutInflater();
                    row = inflater.inflate(R.layout.lv_rows, parent, false);
                    label = (TextView)row.findViewById(R.id.item_title);
                    label.setText(prod_arr[position]);
                    label.setTextColor(Color.WHITE);
               }catch(Exception e){
 
               }
            return row;
        }
    }