【问题标题】:How to add custom adapter using ArrayAdapter?如何使用 ArrayAdapter 添加自定义适配器?
【发布时间】:2013-02-26 06:12:33
【问题描述】:

我正在尝试添加自定义适配器,我想在其中添加文件夹图像和从 Web 服务获取的特定文件夹的名称。

请看我的代码:

ListView listview;
LazyAdapter adapter;

private String[] folderslist;

String User_ID;
int i;

static String ID = "ID";
static String KEY_Name = "FolderName";
static String ParentID = "ParentID";
static String CreatedBy = "CreatedBy";                               

private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://***.***.*.*/somethinghere/something.asmx";
private static final String TREEDATA_METHOD = "TreeData";
private static final String SOAP_ACTION_TREEDATA = "http://tempuri.org/TreeData";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.homepage_layout);

    Intent Intent = getIntent();
    User_ID = Intent.getStringExtra("User_ID");

    Treedata();

    listview.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

            String item = (String) listview.getItemAtPosition(position);
            ID = item;          
            Intent mIntent = new Intent(getApplicationContext(), Files_Folders_Activity.class);
            mIntent.putExtra("ID", ID);

            startActivity(mIntent);

        }
    });

}

        public void Treedata(){
            try {

                SoapObject datarequest = new SoapObject(NAMESPACE, TREEDATA_METHOD);

                datarequest.addProperty("UserID", User_ID);

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet = true;
                envelope.setOutputSoapObject(datarequest);

                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.debug = true;

                androidHttpTransport.call(SOAP_ACTION_TREEDATA, envelope);

                SoapObject folderResponse = (SoapObject)envelope.getResponse();

                Log.i("AllFolders", folderResponse.toString());

                folderslist = new String[folderResponse.getPropertyCount()];

                for(i=0; i<folderResponse.getPropertyCount(); i++) {

                    SoapObject SingleFolder = (SoapObject)folderResponse.getProperty(i);

                    Log.i("SingleFolder", SingleFolder.toString());

                    ID= SingleFolder.getProperty(0).toString();
                    KEY_Name = SingleFolder.getProperty(1).toString();
                    ParentID = SingleFolder.getProperty(2).toString();
                    CreatedBy= SingleFolder.getProperty(3).toString();                      

                    folderslist[i] = SingleFolder.getProperty(0).toString();

                    folderslist = new String[] {ID};

                   }

                    data = new ArrayList<FolderList>();
                    for (int i = 0; i < folderslist.length; i++) {

                    FolderList item = new FolderList(images[i], folderslist[i]);
                    data.add(item);

            }   
                    listview = (ListView)findViewById(R.id.listview);

                    LazyAdapter adapter = new LazyAdapter(this, R.layout.jpg_row, data);

                    listview.setAdapter(adapter);

                    listview.setOnItemClickListener(this);
            }

        }

懒惰适配器:

public class LazyAdapter extends ArrayAdapter<FolderList> {

Context context;

public LazyAdapter(Context context, int resourceId, List<FolderList> items) {
    super(context, resourceId, items);
    this.context = context;
}

/*private view holder class*/
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    FolderList data = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.jpg_row, null);
        holder = new ViewHolder();

        holder.txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
        holder.imageView = (ImageView) convertView.findViewById(R.id.imgIcon);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.txtTitle.setText(data.getTitle());
    holder.imageView.setImageResource(data.getIcon());

    return convertView;
}

}

我正在使用 string[] 获取 Web 响应,然后使用属性 1 获取 id 文件夹名称。任何人都可以让我知道如何添加自定义列表,其中显示文件夹图像和文件夹名称,或者可以以正确的方式引导?谢谢

【问题讨论】:

    标签: android web-services android-arrayadapter custom-adapter


    【解决方案1】:

    首先无需在 for 循环中设置您的适配器。每次运行 for 循环时,它都会将您的适配器设置为 listview。您的代码没有错,但也没有效率。你应该通过下面的方式设置你的 ArrayAdapter Outside for 循环。

         for(i=0; i<folderResponse.getPropertyCount(); i++) {
    
                            SoapObject SingleFolder = (SoapObject)folderResponse.getProperty(i);
    
                            Log.i("SingleFolder", SingleFolder.toString());
    
                            ID= SingleFolder.getProperty(0).toString();
                            KEY_Name = SingleFolder.getProperty(1).toString();
                            ParentID = SingleFolder.getProperty(2).toString();
                            CreatedBy= SingleFolder.getProperty(3).toString();
    
                            System.out.println(ID);
                            System.out.println(KEY_Name);
                            System.out.println(ParentID);
                            System.out.println(CreatedBy);
    
                            folderslist[i] = SingleFolder.getProperty(0).toString();
    
    
                    }
              listview = (ListView)findViewById(R.id.listview);
    
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,   android.R.layout.simple_list_item_1,android.R.id.text1, folderslist);
    
            listview.setAdapter(adapter);
    
            listview.setOnItemClickListener(this);
    

    此外,如果您想使用文件夹图像和文件夹名称自定义列表,您应该使用 BaseAdater 而不是 ArrayAdapter。

    您将从Custom Listview with BaseAdapter Sample Demo 获得更好的想法,如何将自定义列表与 BaseAdapter 一起使用。 希望它会有所帮助。

    【讨论】:

    • 我想要自定义适配器,正在显示列表。问题是我想使用自定义适配器显示来自 Web 服务的文件夹图像和文件夹名称
    • @shiva:我已经编辑了我的答案。
    • 我正在关注本教程,但没有得到任何解决方案。我不知道如何使用 string[count];进入Hashmap,所以我实际上使用了ArrayAdapter。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多