gpt4 book ai didi

自定义适配器中的 Android Dagger 2 依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-29 19:27:11 24 4
gpt4 key购买 nike

我在我的 android 代码中使用 Dagger2 学习依赖注入(inject),在我尝试在我的 CustomAdapter 中为 ListView 注入(inject)演示者之前,我使用它没有任何问题,它总是返回 Null 值。目的是我想在有人单击 ListView 项目时执行 Presenter 功能。这是我的 CustomAdapter 看起来像:

public class CustomAdapter extends BaseAdapter {

ArrayList<String> contactNameList, listGroup;
Context context;
ArrayList<Bitmap> contactImages;
ArrayList<Integer> listContactId;

private static LayoutInflater inflater=null;

@Inject
DetailScreenPresenter detailScreenPresenter;

public CustomAdapter(MainActivity mainActivity, ArrayList<String> contactNameList, ArrayList<Bitmap> contactImages, ArrayList<String> listGroup, ArrayList<Integer> listContactId)
{
this.contactNameList = contactNameList;
context = mainActivity;
this.contactImages = contactImages;
this.listGroup = listGroup;
this.listContactId = listContactId;
inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return contactNameList.size();
}

@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return position;
}

public static class Holder
{

public Holder(View view,Context context)
{
ButterKnife.bind(this,view);

}

@BindView(R.id.txtName)
TextView tvName;

@BindView(R.id.txtGroup)
TextView tvGroup;

@BindView(R.id.imageProfile)
ImageView img;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

View rowView;
rowView = inflater.inflate(R.layout.contact_list, null);
Holder holder=new Holder(rowView, context);

holder.tvName.setText(contactNameList.get(position));
holder.img.setImageBitmap(contactImages.get(position));
holder.tvGroup.setText(listGroup.get(position));
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
detailScreenPresenter.loadDetail(listContactId.get(position));
}
});
return rowView;
}
}

这是触发 CustomAdapter 的 MainActivity

public class MainActivity extends AppCompatActivity implements MainScreenContact.View {

@BindView(R.id.listContact)
ListView listView;

ArrayList<String> listName;
ArrayList<Bitmap> listImage;
ArrayList<String> listGroup;
ArrayList<Integer> listContactId;
HashMap<Integer, Bitmap> tempImageArray;
String[] letter={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};


@Inject
MainScreenPresenter mainPresenter;


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

ButterKnife.bind(this);

listName = new ArrayList<>();
listImage = new ArrayList<>();
tempImageArray = new HashMap<>();
listGroup = new ArrayList<>();
listContactId = new ArrayList<>();

DaggerMainScreenComponent.builder()
.netComponent(((App) getApplicationContext()).getNetComponent())
.mainScreenModule(new MainScreenModule(this, new ContactDatabaseHelper(this)))
.build().inject(this);

mainPresenter.loadPost();
}


@Override
public void showPosts(List<Post> posts) {

Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post post1, Post post2) {
String name1=post1.getFirstName()+" "+post1.getLastName();
String name2=post2.getFirstName()+" "+post2.getLastName();
return name1.compareToIgnoreCase(name2);
}
});

int indexGroup=0;

for (int i = 0; i < posts.size(); i++) {

if(posts.get(i).getProfilePic().contains("http"))
mainPresenter.loadImage(posts.get(i).getProfilePic(), i);
else
mainPresenter.loadImage("http://example.com", i);


if(Arrays.binarySearch(letter,Character.toString(posts.get(i).getFirstName().charAt(0)).toUpperCase())==-1)
{
if(listGroup.size()==0)
listGroup.add("*");
else
listGroup.add(" ");
}
else
{
if(!listGroup.get(indexGroup).equalsIgnoreCase(Character.toString(posts.get(i).getFirstName().charAt(0)))) {
listGroup.add(Character.toString(posts.get(i).getFirstName().charAt(0)).toUpperCase());
indexGroup = i;
}
else
listGroup.add(" ");
}

listContactId.add(i, posts.get(i).getId());
listName.add(i, posts.get(i).getFirstName() + " " + posts.get(i).getLastName());

}

}


@Override
public void showError(String message) {
Toast.makeText(getApplicationContext(), "Error" + message, Toast.LENGTH_LONG).show();
}

@Override
public void showComplete() {
Toast.makeText(getApplicationContext(), "Complete", Toast.LENGTH_LONG).show();
}

@Override
public void setImageProfile(Bitmap profileBmp, int x) {
tempImageArray.put(x, profileBmp);

if(tempImageArray.size()==listName.size())
{

SortedSet<Integer> keys = new TreeSet<Integer>(tempImageArray.keySet());
for(Integer key : keys)
{
listImage.add(tempImageArray.get(key));
}

listView.setAdapter(new CustomAdapter(this, listName, listImage, listGroup, listContactId));
}

}
}

请帮助如何注入(inject) DetailScreenPresenter 演示者。

非常感谢

最佳答案

一般来说,为了对任何对象进行注入(inject),你应该显式地调用<some_dagger_component>.inject(<target_object>)。 .

在您的情况下,您可以这样做:

CustomAdapter adapter = new CustomAdapter(this, listName, listImage, listGroup, listContactId);

DaggerMainScreenComponent.builder()
.netComponent(((App) getApplicationContext()).getNetComponent())
.mainScreenModule(new MainScreenModule(this, new ContactDatabaseHelper(this)))
.build().inject(adapter);

listView.setAdapter(adapter);

但是,您试图做的是滥用依赖注入(inject)框架 - 您不应该对适配器执行注入(inject),而只是将所需的对象传递给适配器的构造函数。

this post您可以在 Android 中找到有关依赖项注入(inject)的更多信息。

关于自定义适配器中的 Android Dagger 2 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com