安卓:使用动态Sublayout绑定布局(ViewHolder&安培; SubViewHolder) [英] Android: Binding Layout with Dynamic Sublayout (ViewHolder & SubViewHolder)

查看:244
本文介绍了安卓:使用动态Sublayout绑定布局(ViewHolder&安培; SubViewHolder)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我解析JSON从服务器到Android和存储在SQLite的数据中,我有两个表新闻 news_attachment

我已经做了code在列表中显示新闻 news_attachment ,但现在我想显示多个附件一的消息。

  

下面code显示特定的消息last_attachment。   我想显示所有连接使用自定义布局,这将是在父视图自动解决。

NewsAdapter.java

 公共类NewsAdapter扩展SimpleCursorAdapter {

    DatabaseHelper dbHelper;

    LayoutInflater充气;

    公共NewsAdapter(上下文的背景下,INT布局,光标C,
        的String []从,INT []键,诠释标志){
    超(背景下,布局,C,从到,旗);

    充气= LayoutInflater.from(上下文);

    dbHelper =新DatabaseHelper(上下文);
    dbHelper.open();
    }

    @覆盖
    公共无效bindView(查看convertView,上下文的背景下,光标光标){

    ViewHolder支架=(ViewHolder)convertView.getTag();

    如果(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE))){
        holder.newsTitleText.setVisibility(View.GONE);
    } 其他 {
        holder.newsTitleText.setVisibility(View.VISIBLE);
        holder.newsTitleText.setText(+ cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE)));
    }

    如果(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT))){
        holder.newsText.setVisibility(View.GONE);
    } 其他 {
        holder.newsText.setVisibility(View.VISIBLE);
        串newsText = cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT));
        newsText = Html.fromHtml(newsText)的ToString();
        holder.newsText.setText(newsText);
    }

    / ************
     *获取子光标...
     * /
    光标newsAttachmentCursor;
    INT NewSID的;

    / **
     *设置的news_Attachment表值...
     * /
    NewSID的= cursor.getInt(cursor.getColumnIndex(DatabaseHelper.NEWS_SERVER_ID));
    newsAttachmentCursor = dbHelper.getNewsAttachment(NewSID的);

    / **
     *显示新闻附件
     * /
    如果(newsAttachmentCursor.getCount()大于0&安培;&安培;!newsAttachmentCursor =空){
        newsAttachmentCursor.moveToFirst();

        / **
         *显示NEWS_AT_NAME
         * /
        如果(newsAttachmentCursor.isNull(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME))){
        holder.newsAttachment.setVisibility(View.GONE);
        } 其他{
        holder.newsAttachment.setVisibility(View.VISIBLE);

        / **
         *显示如果附件有图片....
         * /
        字符串文件名= newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
        串fileUrl = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL));

        串tempLowerUrl = fileUrl.toLowerCase();
        如果(tempLowerUrl = NULL和放大器;&安培;!(tempLowerUrl.contains(PNG)|| tempLowerUrl.contains(JPEG)|| tempLowerUrl.contains(JPG)|| tempLowerUrl.contains(ttif)| | tempLowerUrl.contains(GIF)))
        {
            holder.newsAttachment.setVisibility(View.GONE);
            holder.newsImage.setVisibility(View.VISIBLE);
            Log.d(oopscv2,文件:+ fileUrl);
            新AQuery(mContext).id(holder.newsImage).image(newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL)),真正的,真实的,0,R.drawable.no_image,空,AQuery.FADE_IN);
        } 其他 {
            holder.newsAttachment.setVisibility(View.VISIBLE);
            holder.newsImage.setVisibility(View.GONE);
            holder.newsAttachment.setText(文件名);
        }
        }
    } 其他 {
        holder.newsAttachment.setVisibility(View.GONE);
        holder.newsImage.setVisibility(View.GONE);
    }
    }

    @覆盖
    公共查看NewView的(上下文的背景下,光标光标的ViewGroup父){
    视图V = inflater.inflate(R.layout.frag_news_row,父母,假);
    v.setTag(新ViewHolder(ⅴ));
    返回伏;
    }

    私有静态类ViewHolder
    {
    TextView的newsTitleText;
    TextView的newsText;
    ImageView的newsImage;
    TextView的newsAttachment;

    公共ViewHolder(查看视图){
        // TODO自动生成构造函数存根

        newsTitleText =(TextView中)view.findViewById(R.id.newsTitleText);
        newsText =(TextView中)view.findViewById(R.id.newsText);
        newsImage =(ImageView的)view.findViewById(R.id.newsImage);
        newsAttachment =(TextView中)view.findViewById(R.id.newsAttachment);
    }
    }
}
 

电流输出:

我要动态输出像(临时附件4):

我觉得动态视图是对这项有益的,但​​我不知道如何动态地添加视图与的onClick监听器的所有附件的格式。

怎么样了其可能的。?


解决上述问题后更新问题:

现在我有以下更新适配器:

NewsNewAdapter.java

 公共类NewsAdapterNew扩展SimpleCursorAdapter {

    DatabaseHelper dbHelper;

    LayoutInflater充气;

    ViewHolder持有人;

    ViewHolder.SubViewHolder subHolder;

    字符串DIRPATH = android.os.Environment.getExternalStorageDirectory()+文件分割符+TEMP+文件分割符;

    公共NewsAdapterNew(上下文的背景下,INT布局,光标C,
        的String []从,INT []键,诠释标志){
    超(背景下,布局,C,从到,旗);

    充气= LayoutInflater.from(上下文);

    dbHelper =新DatabaseHelper(上下文);
    dbHelper.open();
    }

    @覆盖
    公共无效bindView(查看convertView,最终上下文的背景下,光标光标){

    支架=(ViewHolder)convertView.getTag();

    如果(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE))){
        holder.newsTitleText.setVisibility(View.GONE);
    } 其他 {
        holder.newsTitleText.setVisibility(View.VISIBLE);
        holder.newsTitleText.setText(+ cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE)));
    }

    如果(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT))){
        holder.newsText.setVisibility(View.GONE);
    } 其他 {
        holder.newsText.setVisibility(View.VISIBLE);
        串newsText = cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT));
        newsText = Html.fromHtml(newsText)的ToString();
        holder.newsText.setText(newsText);
    }

    / ************
     *获取子光标...
     * /
    光标newsAttachmentCursor;
    INT NewSID的;

    / **
     *设置的news_Attachment表值...
     * /
    NewSID的= cursor.getInt(cursor.getColumnIndex(DatabaseHelper.NEWS_SERVER_ID));
    newsAttachmentCursor = dbHelper.getNewsAttachment(NewSID的);

    Log.d(TAG,newsAttachmentCursor.getCount():+ newsAttachmentCursor.getCount());

    / **
     *显示新闻附件
     * /
    如果(newsAttachmentCursor.getCount()大于0&安培;&安培;!newsAttachmentCursor =空){
        //newsAttachmentCursor.moveToFirst();

        / **
         *显示NEWS_AT_NAME
         * /
        holder.layoutAttachment.removeAllViews();

        newsAttachmentCursor.moveToFirst();

        做 {

        查看viewAttachement = LayoutInflater.from(mContext).inflate(R.layout.attachment_layout,NULL);

        subHolder =新com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder(viewAttachement);

        subHolder.newsImage.setTag(subHolder);
        subHolder.newsImageDownload.setTag(subHolder);
        subHolder.newsAttachmentFileName.setTag(subHolder);

        / **
         *显示如果附件有图片....
         * /
        subHolder.fileName = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
        subHolder.fileUrl = newsAttachmentCursor.isNull(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL))? :newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL));

        subHolder.newsAttachmentFileName.setText(subHolder.fileName);

        串tempExt = subHolder.fileUrl.contains(。)? subHolder.fileUrl.substring(。subHolder.fileUrl.lastIndexOf())与toLowerCase():,;。

        Log.d(TAG,临时扩展名:+ tempExt);

        如果(!tempExt.isEmpty()){

            myfile文件=新的文件(DIRPATH + subHolder.fileName);

            如果(myFile.exists()){
            subHolder.newsImageDownload.setVisibility(View.GONE);
            } 其他 {
            subHolder.newsImageDownload.setVisibility(View.VISIBLE);
            }

            如果(tempExt = NULL和放大器;!&安培; tempExt.equals(MP4)||(tempExt.equals()|| tempExt.equals()|| tempExt.equals(JPEG,JPG。 ttif)|| tempExt.equals(GIF)|| tempExt.equals(png格式)|| tempExt.equals(PDF)|| tempExt.equals(DOCX)|| tempExt .equals(DOC)|| tempExt.equals(XLS)|| tempExt.equals(XLSX)|| tempExt.equals(PPT)|| tempExt.equals(。PPTX )|| tempExt.equals(TXT)|| tempExt.equals(拉链)))
            {
            subHolder.newsImage.setVisibility(View.VISIBLE);

            如果(tempExt.equals(PDF)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_pdf);
            }否则,如果(tempExt.equals(DOC)|| tempExt.equals(DOCX)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_word);
            }否则,如果(tempExt.equals(XLS)|| tempExt.equals(XLSX)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_excel);
            }否则,如果(tempExt.equals(PPT)|| tempExt.equals(PPTX)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_ppt);
            }否则,如果(tempExt.equals(TXT)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_text);
            }否则,如果(tempExt.equals(拉链)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_zip);
            }否则,如果(tempExt.equals(MP4)){
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(R.drawable.ic_video);
            } 其他 {
                subHolder.newsImage.setVisibility(View.VISIBLE);
                新AQuery(mContext).ID(subHolder.newsImage)在图像配(subHolder.fileUrl,真正的,真实的,0,R.drawable.no_image,空,AQuery.FADE_IN);
            }
            } 其他 {
            subHolder.newsImage.setVisibility(View.GONE);
            subHolder.newsImageDownload.setVisibility(View.GONE);
            }

            / ***
             *
             * /
            subHolder.newsImageDownload.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder tempHolder =((com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder)v.getTag());
                //Toast.makeText(mContext,tempHolder.fileName.toString()+正在下载...,Toast.LENGTH_LONG).show();

                如果(InternetConnection.checkConnection(上下文)){
                tempHolder.newsImageDownload.setVisibility(View.GONE);
                tempHolder.pBar.setVisibility(View.VISIBLE);
                新DownloadFileAsync()执行(tempHolder);
                } 其他 {
                tempHolder.newsImageDownload.setVisibility(View.VISIBLE);
                tempHolder.pBar.setVisibility(View.GONE);
                AlertDialogManager.showAlertDialog(背景下,下载失败,下载无法完成,请稍后重试。,假);
                }
            }
            });


            subHolder.newsImage.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                尝试 {
                com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder tempHolder =((com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder)v.getTag());

                Toast.makeText(mContext,下载:+ tempHolder.fileName.toString(),Toast.LENGTH_LONG).show();

                myfile文件=新的文件(DIRPATH + tempHolder.fileName.toString());

                FileOpen.openFile(mContext,MYFILE);

                }赶上(例外五){
                // TODO自动生成的catch块
                Log.d(TAG,错误而开口道:+ e.getLocalizedMessage());
                }
            }
            });

                / **添加新闻附件布局在父母的LinearLayout ** /
            holder.layoutAttachment.addView(viewAttachement);
        }

        viewAttachement.setTag(subHolder);

        }而(newsAttachmentCursor.moveToNext());

    } 其他 {
        holder.layoutAttachment.setVisibility(View.GONE);
    }

    }

    @覆盖
    公共查看NewView的(上下文的背景下,光标光标的ViewGroup父){
    视图V = inflater.inflate(R.layout.frag_news_row,父母,假);
    v.setTag(新ViewHolder(ⅴ));
    返回伏;
    }

    私有静态类ViewHolder
    {
    TextView的newsTitleText;
    TextView的newsText;
    的LinearLayout layoutAttachment;

    静态类SubViewHolder {
        ImageView的newsImage,newsImageDownload;
        TextView的newsAttachmentFileName;
        进度PBAR;

        字符串fileUrl;
        字符串文件名;

        公共SubViewHolder(查看子视图){
        // TODO自动生成构造函数存根
        newsImage =(ImageView的)subView.findViewById(R.id.newsImage);
        newsImageDownload =(ImageView的)subView.findViewById(R.id.newsImageDownload);
        PBAR =(进度)subView.findViewById(R.id.newsProgressBar);
        newsAttachmentFileName =(TextView中)subView.findViewById(R.id.newsAttachment);
        }
    }

    公共ViewHolder(查看视图){
        // TODO自动生成构造函数存根
        newsTitleText =(TextView中)view.findViewById(R.id.newsTitleText);
        newsText =(TextView中)view.findViewById(R.id.newsText);
        layoutAttachment =(的LinearLayout)view.findViewById(R.id.linear_news_row_attachment);
    }
    }
}
 

frag_new_row.xml

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / newsLayout
    机器人:layout_width =match_parent
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_margin =5DP
    机器人:背景=@可绘制/ bg_white_shadow
    机器人:方向=垂直
    机器人:填充=10dp>

    <的TextView
        机器人:ID =@ + ID / newsTitleText
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_marginBottom =3DP
        机器人:文本=新闻从
        机器人:文字颜色=@机器人:彩色/黑白
        机器人:TEXTSIZE =@扪/ common_title_textview
        机器人:TEXTSTYLE =黑体/>

    <的TextView
        机器人:ID =@ + ID / newsText
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=新闻文本新闻文本
        机器人:文字颜色=@机器人:彩色/黑白
        机器人:TEXTSIZE =@扪/ common_fontsize/>

    <的LinearLayout
        机器人:ID =@ + ID / linear_news_row_attachment
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT
        机器人:方向=垂直>
    < / LinearLayout中>

< / LinearLayout中>
 


问题:

  

虽然有时滚动新闻每人将空白全部财经新闻附件。我觉得这个问题发生在适配器,绑定的看法,但我不能找到。

您将更多的通过下面的图像理解这一点。

输出之前滚动:

输出滚动后:

是我的适配器code是错的?什么错误,我在适配器都做了什么?

您的帮助将是AP preciated。

感谢和放大器;问候,

PRATIK

解决方案

要实现自己的目标最简单的方法就是以编程方式添加查看每个附件。 你必须这样做水木清华这样的: 使holder.newsAttachments - LinearLayout中,例如:

然后在您的bindView方式:

  holder.newsAttachment.removeAllViews();如果存在//删除意见
而(newsAttachmentCursor.moveToNext()){
  查看查看= LayoutInflater.from(上下文).inflate(R.layout.layout_for_attachment,NULL);

  //填写看法
  字符串文件名= newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
  view.setTag(文件名); //添加为标签的东西,你所需要的内部onCLickListener
  ((TextView中)view.findViewById(R.id.attachment_view_name))的setText(全名)。
  holder.newsAttachment.addView(视图);
  view.setOnClickListener(新OnClickListener(){
    @覆盖
    无效的onClick(视图v){
       字符串文件名=(字符串)v.getTag();
       //做你想要的文件名,或者任何你所添加的内容进行标记。
    }
  });
}
 

这是唯一的例子,但是这个想法会工作正常,少量附件。

I am parsing JSON from server to Android and storing data in SQLite in which i have two tables news and news_attachment.

I have done code for displaying news and news_attachment in list but now i want to display multiple attachment for one news.

The following code displaying last_attachment of the particular news. I want to display all attachment with Custom Layout which will be settle automatically in parent view.

NewsAdapter.java

public class NewsAdapter extends SimpleCursorAdapter {

    DatabaseHelper dbHelper;

    LayoutInflater inflater;

    public NewsAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);

    inflater = LayoutInflater.from(context);

    dbHelper = new DatabaseHelper(context);
    dbHelper.open();
    }

    @Override
    public void bindView(View convertView, Context context, Cursor cursor) {

    ViewHolder holder = (ViewHolder) convertView.getTag();

    if(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE))) {
        holder.newsTitleText.setVisibility(View.GONE);
    } else {
        holder.newsTitleText.setVisibility(View.VISIBLE);
        holder.newsTitleText.setText(""+cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE)));
    }

    if(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT))) {
        holder.newsText.setVisibility(View.GONE);
    } else {
        holder.newsText.setVisibility(View.VISIBLE);
        String newsText = cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT));
        newsText = Html.fromHtml(newsText).toString();
        holder.newsText.setText(newsText);
    }

    /***************************
     *  Getting Child Cursor... 
     */
    Cursor newsAttachmentCursor;
    int newsId;

    /**
     * Setting up values of news_Attachment Table...
     */
    newsId = cursor.getInt(cursor.getColumnIndex(DatabaseHelper.NEWS_SERVER_ID));
    newsAttachmentCursor = dbHelper.getNewsAttachment(newsId);

    /**
     * Displaying news Attachment
     */
    if(newsAttachmentCursor.getCount() > 0 && newsAttachmentCursor != null){
        newsAttachmentCursor.moveToFirst();

        /**
         * Displaying NEWS_AT_NAME
         */
        if(newsAttachmentCursor.isNull(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME))) {
        holder.newsAttachment.setVisibility(View.GONE);
        } else{
        holder.newsAttachment.setVisibility(View.VISIBLE);

        /**
         * Displaying If attachment has Images....
         */
        String fileName = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
        String fileUrl = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL));

        String tempLowerUrl = fileUrl.toLowerCase();
        if(tempLowerUrl != null && (tempLowerUrl.contains("png") || tempLowerUrl.contains("jpeg") || tempLowerUrl.contains("jpg") || tempLowerUrl.contains("ttif") || tempLowerUrl.contains("gif")))
        {
            holder.newsAttachment.setVisibility(View.GONE);
            holder.newsImage.setVisibility(View.VISIBLE);
            Log.d("oopscv2", "File : "+fileUrl);
            new AQuery(mContext).id(holder.newsImage).image(newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL)), true, true, 0, R.drawable.no_image, null, AQuery.FADE_IN);
        } else {
            holder.newsAttachment.setVisibility(View.VISIBLE);
            holder.newsImage.setVisibility(View.GONE);
            holder.newsAttachment.setText(fileName);    
        }
        }
    } else {
        holder.newsAttachment.setVisibility(View.GONE);
        holder.newsImage.setVisibility(View.GONE);
    }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = inflater.inflate(R.layout.frag_news_row, parent, false);
    v.setTag(new ViewHolder(v));
    return v;
    }

    private static class ViewHolder
    {
    TextView newsTitleText;
    TextView newsText;
    ImageView newsImage;
    TextView newsAttachment;

    public ViewHolder(View view) {
        // TODO Auto-generated constructor stub

        newsTitleText   = (TextView) view.findViewById(R.id.newsTitleText);
        newsText        = (TextView) view.findViewById(R.id.newsText);
        newsImage       = (ImageView) view.findViewById(R.id.newsImage);
        newsAttachment  = (TextView) view.findViewById(R.id.newsAttachment);
    }
    }
}

Current Output:

I want dynamic output like (temporary 4 attachment):

I think dynamic view is useful for this but i dont know how to add dynamically view with formatting with onClick listener for all attachment.

Hows its possible.?


Updated Question after solved above question:

Now i have following Updated Adapter:

NewsNewAdapter.java

public class NewsAdapterNew extends SimpleCursorAdapter {

    DatabaseHelper dbHelper;

    LayoutInflater inflater;

    ViewHolder holder;

    ViewHolder.SubViewHolder subHolder;

    String DIRPATH = android.os.Environment.getExternalStorageDirectory() + File.separator + "TEMP" + File.separator;

    public NewsAdapterNew(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);

    inflater = LayoutInflater.from(context);

    dbHelper = new DatabaseHelper(context);
    dbHelper.open();
    }

    @Override
    public void bindView(View convertView, final Context context, Cursor cursor) {

    holder = (ViewHolder) convertView.getTag();

    if(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE))) {
        holder.newsTitleText.setVisibility(View.GONE);
    } else {
        holder.newsTitleText.setVisibility(View.VISIBLE);
        holder.newsTitleText.setText(""+cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TITLE)));
    }

    if(cursor.isNull(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT))) {
        holder.newsText.setVisibility(View.GONE);
    } else {
        holder.newsText.setVisibility(View.VISIBLE);
        String newsText = cursor.getString(cursor.getColumnIndex(DatabaseHelper.NEWS_TEXT));
        newsText = Html.fromHtml(newsText).toString();
        holder.newsText.setText(newsText);
    }

    /***************************
     *  Getting Child Cursor... 
     */
    Cursor newsAttachmentCursor;
    int newsId;

    /**
     * Setting up values of news_Attachment Table...
     */
    newsId = cursor.getInt(cursor.getColumnIndex(DatabaseHelper.NEWS_SERVER_ID));
    newsAttachmentCursor = dbHelper.getNewsAttachment(newsId);

    Log.d(TAG, "newsAttachmentCursor.getCount() : " +newsAttachmentCursor.getCount());

    /**
     * Displaying news Attachment
     */
    if(newsAttachmentCursor.getCount() > 0 && newsAttachmentCursor != null){
        //newsAttachmentCursor.moveToFirst();

        /**
         * Displaying NEWS_AT_NAME
         */
        holder.layoutAttachment.removeAllViews();

        newsAttachmentCursor.moveToFirst();

        do {

        View viewAttachement = LayoutInflater.from(mContext).inflate(R.layout.attachment_layout, null);

        subHolder = new com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder(viewAttachement);

        subHolder.newsImage.setTag(subHolder);
        subHolder.newsImageDownload.setTag(subHolder);
        subHolder.newsAttachmentFileName.setTag(subHolder);

        /**
         * Displaying If attachment has Images....
         */
        subHolder.fileName = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
        subHolder.fileUrl = newsAttachmentCursor.isNull(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL)) ? "" :  newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_URL));

        subHolder.newsAttachmentFileName.setText(subHolder.fileName);

        String tempExt = subHolder.fileUrl.contains(".") ? subHolder.fileUrl.substring(subHolder.fileUrl.lastIndexOf(".")).toLowerCase() : "";

        Log.d(TAG, "Temp Extension : "+tempExt);

        if(!tempExt.isEmpty()) {

            File myFile = new File(DIRPATH + subHolder.fileName);

            if(myFile.exists()) {
            subHolder.newsImageDownload.setVisibility(View.GONE);
            } else {
            subHolder.newsImageDownload.setVisibility(View.VISIBLE);
            }

            if(tempExt != null && tempExt.equals(".mp4") || (tempExt.equals(".jpeg") || tempExt.equals(".jpg") || tempExt.equals(".ttif") || tempExt.equals(".gif") || tempExt.equals(".png")|| tempExt.equals(".pdf")|| tempExt.equals(".docx")|| tempExt.equals(".doc")|| tempExt.equals(".xls")|| tempExt.equals(".xlsx")|| tempExt.equals(".ppt")|| tempExt.equals(".pptx")|| tempExt.equals(".txt")|| tempExt.equals(".zip")))
            {
            subHolder.newsImage.setVisibility(View.VISIBLE);

            if(tempExt.equals(".pdf")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_pdf);
            } else if(tempExt.equals(".doc") || tempExt.equals(".docx")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_word);
            } else if(tempExt.equals(".xls") || tempExt.equals(".xlsx")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_excel);
            } else if(tempExt.equals(".ppt") || tempExt.equals(".pptx")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_ppt);
            } else if(tempExt.equals(".txt")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_text);
            } else if(tempExt.equals(".zip")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_zip);
            } else if(tempExt.equals(".mp4")) {
                new AQuery(mContext).id(subHolder.newsImage).image(R.drawable.ic_video);
            } else {
                subHolder.newsImage.setVisibility(View.VISIBLE);
                new AQuery(mContext).id(subHolder.newsImage).image(subHolder.fileUrl, true, true, 0, R.drawable.no_image, null, AQuery.FADE_IN);
            }
            } else {
            subHolder.newsImage.setVisibility(View.GONE);
            subHolder.newsImageDownload.setVisibility(View.GONE);
            }

            /***
             * 
             */
            subHolder.newsImageDownload.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder tempHolder = ((com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder)v.getTag());
                //Toast.makeText(mContext, tempHolder.fileName.toString() + " is Downloading...", Toast.LENGTH_LONG).show();

                if(InternetConnection.checkConnection(context)) {
                tempHolder.newsImageDownload.setVisibility(View.GONE);
                tempHolder.pBar.setVisibility(View.VISIBLE);
                new DownloadFileAsync().execute(tempHolder);
                } else {
                tempHolder.newsImageDownload.setVisibility(View.VISIBLE);
                tempHolder.pBar.setVisibility(View.GONE);
                AlertDialogManager.showAlertDialog(context, "Download failed", "The download was unable to complete. Please try again later.", false);
                }
            }
            });


            subHolder.newsImage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder tempHolder = ((com.salesman.adapter.NewsAdapterNew.ViewHolder.SubViewHolder)v.getTag());

                Toast.makeText(mContext, "Downloaded : " + tempHolder.fileName.toString(), Toast.LENGTH_LONG).show();

                File myFile = new File(DIRPATH + tempHolder.fileName.toString());

                FileOpen.openFile(mContext, myFile);

                } catch (Exception e) {
                // TODO Auto-generated catch block
                Log.d(TAG, "Error While Opening : "+e.getLocalizedMessage());
                }
            }
            });

                /** Adding News Attachment Layout in Parent LinearLayout **/
            holder.layoutAttachment.addView(viewAttachement);
        }

        viewAttachement.setTag(subHolder);

        } while(newsAttachmentCursor.moveToNext());

    } else {
        holder.layoutAttachment.setVisibility(View.GONE);
    }

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = inflater.inflate(R.layout.frag_news_row, parent, false);
    v.setTag(new ViewHolder(v));
    return v;
    }

    private static class ViewHolder
    {
    TextView newsTitleText;
    TextView newsText;
    LinearLayout layoutAttachment;

    static class SubViewHolder {
        ImageView newsImage,newsImageDownload;
        TextView newsAttachmentFileName;
        ProgressBar pBar;

        String fileUrl;
        String fileName;

        public SubViewHolder(View subView) {
        // TODO Auto-generated constructor stub
        newsImage   = (ImageView) subView.findViewById(R.id.newsImage);
        newsImageDownload =(ImageView) subView.findViewById(R.id.newsImageDownload);
        pBar        = (ProgressBar) subView.findViewById(R.id.newsProgressBar);
        newsAttachmentFileName = (TextView) subView.findViewById(R.id.newsAttachment);
        }
    }

    public ViewHolder(View view) {
        // TODO Auto-generated constructor stub
        newsTitleText   = (TextView) view.findViewById(R.id.newsTitleText);
        newsText        = (TextView) view.findViewById(R.id.newsText);
        layoutAttachment = (LinearLayout) view.findViewById(R.id.linear_news_row_attachment);
    }
    }
}

frag_new_row.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/newsLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="@drawable/bg_white_shadow"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/newsTitleText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="3dp"
        android:text="News From"
        android:textColor="@android:color/black"
        android:textSize="@dimen/common_title_textview"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/newsText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="News Text News Text"
        android:textColor="@android:color/black"
        android:textSize="@dimen/common_fontsize" />

    <LinearLayout
        android:id="@+id/linear_news_row_attachment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>


Problem:

While scrolling sometimes all News Attachment per News going to blank. I think this problem occurring in adapter while binding view but i cant found.

You will more understand this by following images.

Output Before Scrolling:

Output After Scrolling:

Is my adapter code is wrong? What mistake i have done in Adapter?

Your help would be appreciated.

Thanks & Regards,

Pratik

解决方案

The easiest way to achieve your goal is to add view for each attachment programmatically. You must do smth like this: make holder.newsAttachments - linearLayout, for example.

Then in your bindView method:

holder.newsAttachment.removeAllViews(); //remove views if it exists
while (newsAttachmentCursor.moveToNext()) {
  View view = LayoutInflater.from(context).inflate(R.layout.layout_for_attachment, null);

  //fill view
  String fileName = newsAttachmentCursor.getString(newsAttachmentCursor.getColumnIndex(DatabaseHelper.NEWS_AT_NAME));
  view.setTag(fileName); // add as tag something, what you need inside onCLickListener
  ((TextView) view.findViewById(R.id.attachment_view_name)).setText(fullName);
  holder.newsAttachment.addView(view);
  view.setOnClickListener(new OnClickListener() {
    @Override
    void onClick(View v) {
       String fileName = (String) v.getTag();
       //do what you want with file name, or anything what you've added to tag.
    }
  });
}

It's only example, but this idea will works fine for small amount of attachments.

这篇关于安卓:使用动态Sublayout绑定布局(ViewHolder&安培; SubViewHolder)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆