安卓:使用动态Sublayout绑定布局(ViewHolder&安培; SubViewHolder) [英] Android: Binding Layout with Dynamic 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:机器人=http://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屋!